awk精解

简介:

下面介绍的是三种文本处理工具之一-----------------awk


文本处理三剑客为grep、sed(流编辑器)、awk(报告生成器)。awk来源于贝尔实验室的三个人,三个字母分别提取自名字。

1、awk基础

(1)awk命令简介

 格式:awk [options] 'program' file...

 program:即 pattern{action statements;...},其中pattern(BEGIN、END),action statement(print、printf)

 常用选项:

 -F -----------指明字段分隔符,默认为空白字符

 -v var=value -----------自定义变量,为自定义变量赋初始值

 例:awk [options] 'pattern{action statements;...}' file...

 awk默认使用内置位置变量来存储各个字段的值,即$1、$2、...$N。使用$0保存整行的内容。

 awk默认的分隔符为空白字符。

(2)、awk工作原理

    1)、执行BEGIN{action statements} ----------awk开始之前执行,可选

    2)、执行pattern{action statements} --------逐行读取、逐行重复,可选

    3)、执行END{action statements} -------------退出awk之前执行,可选


2、awk命令 ----------变量

 awk的变量分为两种,即:内建变量、自定义变量。

 常用的10个变量介绍和示例如下:

(1)、print:标准格式显示。---------默认各个字段用逗号分隔

    print item1,item2... -------如果省略item,输出整行,相当于{print $0},输出整个文件

(2)、FS -----------输入字段分隔符,默认空白字符

       OFS ----------输出字段分隔符,默认空白字符

  例:

    # awk -v FS=':' -v OFS=':' '{print $1,$3}' /etc/passwd

  例:

    # echo -e "1 2 3\n4 5 6\n7 8 9" | awk -v FS=' ' '{print $1}' -----------自定义分隔符

    # echo -e "1 2 3\n4 5 6\n7 8 9" | awk -v FS=' ' -v OFS='@' '{print $1,$2}'

    1@2

    4@5

    7@8

(3)、RS --------------输入记录分隔符,默认换行符

       ORS --------------输出记录分隔符

  例:

    # awk -v RS='/' '{print $0}' /etc/passwd 

  例:   

    # echo -e "1 2 3 4@5 6 7 8 9" | awk -v RS='@' '{print $0}'

    1 2 3 4

    5 6 7 8 9

    # echo -e "1 2 3 4@5 6 7 8 9" | awk -v RS='@' -v ORS='/' '{print $0}' ---------$0代表整行

    1 2 3 4/5 6 7 8 9

(4)、NF --------------字段数量,内建

  例:

    # echo -e "1 2 3 4@5 6 7 8 9" | awk '{print NF}'

    8 -------------显示字段数

    # echo -e "1 2 3 4@5 6 7 8 9" | awk '{print $NF}'

    9 ------------显示最后一个字段具体的内容

  例:

  例:

    # awk -v FS=':' '{print NF}' /etc/passwd

    # awk -v FS=':' '{print $NF}' /etc/passwd

    # awk -v FS=':' '{print $(NF-1)}' /etc/passwd

(5)、NR -------------输出每次遍历的行数,可以理解为行号

  例:

    # echo -e "1 2 3 4\n5 6 7 8 9" | awk '{print NR}'

    1

    2

(6)、FNR ---------输出每个文件的行数,分别统计

  例:

    # echo -e "1 2 3 4\n5 6 7 8 9" | awk '{print NR}'

    1

    2 --------------若是文件众多的话,不会接上,是重新分别统计。  

(7)、FILENAEM ------------输出文件名

  例:

    # echo -e "1 2 3 4\n5 6 7 8 9" | awk '{print FILENAME}'

    -

    -

(8)、ARGC --------------输出命令行参数,命令本身算一个

  例:

    # echo -e "1 2 3 4\n5 6 7 8 9" | awk '{print ARGC}'

    1

    1

    # awk '{print ARGC}' /etc/passwd

    2

    ...

(9)、ARGV ---------------调用数组

  例:

    # awk '{print ARGV[1]}' /etc/passwd /etc/issue

    /etc/passwd

    /etc/passwd

(10)、varl="VALE" ----------自定义变量

    # awk -v varl='hello' -F ":" '{print varl ,$1}' /etc/passwd --------------varl ,$1(之间可以有空格,也可以没有 )

    hello root

    hello bin


3、awk命令 ------------printf

  awk中的printf命令,是格式化输出命令,默认不自动换行,需要显式给出换行控制符(\n)

  格式:printf "FORMAT" item1,item2,...

  格式符:

    %c -----------ASCII码显示

    %d,%i ---------十进制整数显示

    %f -----------浮点数显示

    %e、%E -----------科学计数法显示【数字】

    %g、%G ----------科学计数法显示【浮点数字】

    %s -----------显示字符串

    %u ------------显示无符号整数

    %% ---------------显示%自身

  

  修饰符:#[.#]

  #[.#]的第一个数字用来控制显示【宽度】,第二个数字表示小数点的【精度】。

  例:%3.1f  %5s

  #[.#]中,加入+、-有特殊意义,具体如下:

    -:表示采用左对齐机制,默认是右对齐。例:%-15s

    +:显示数字的正负符号。例:%+d

  例:

  # awk -F: '{printf "%-20s: %-5s\n",$1,$3}' /etc/passwd


4、awk命令 -------------操作符

  # awk -F: '$3==1000{print $0}' /etc/passwd 

  # awk -F: '$NF~/bash/{print $0}' /etc/passwd -----------匹配(!~不匹配)

  # awk -F: '$3>=500&&$3<=1000{print}' /etc/passwd ----------与或非

  # awk -F: '{$3>=1000?usertype="Common User":usertype="Super or System User";printf "%-20s: %-20s\n",usertype,$1}' /etc/passwd ------------条件表达式


5、awk命令 ------------匹配模式(5种)

(1)、empty ---------空模式,处理每一行

(2)、[!]/REGEXP/ ---------------是否PATTERN匹配到的行

  例:

  # awk '[!]/^r/{print}' /etc/passwd

(3)、关系表达式

  例:$3>=1000, $NF~/bash/

(4)、/regexp1/,/regexp2/ -------regexp1到regexp2的行,有多少这一类匹配结果,就显示多少次

  例:($3>=500&&$3<=1000)

  例:

  # awk '/^r/,/^a/{print}' /etc/passwd

(5)、BEGIN/END模式:

  BEGIN{} ----------开始处理时,第一行文本之前执行一次

  例:

  # awk -F: 'BEGIN{printf "%20s %5s\n","Username","UserID"}{printf "%20s %5s\n",$1,$3}' /etc/passwd

            注意:在输出特定格式的表头时,常用此语句块;

  END{} ------------文本处理完成,命令尚未退出时,执行一次

  例:

  # awk -F: 'BEGIN{printf "%20s %5s\n","Username","UserID"}{printf "%20s %5s\n",$1,$3}END{print "========================\n",NR " users"}' /etc/passwd


6、awk命令 ---------------控制语句(6个)

(1)、 if-else -----------条件判断

  例:

  # awk -F: '{if($3>=1000) {print $1} else {print $1,$3}}' /etc/passwd

(2)、while循环 ------------对一行内的多个字段逐一处理时、遍历数组

  例:

  # awk '/^[[:space:]]*linux16/{i=1;while(i<=NF) {printf "%s: %d\n",$i,length($i);i++}}' /etc/grub2.cfg 

(3)、do...while循环 -----------至少执行一次循环体中的语句

(4)、for循环:

  例:

  # awk '/^[[:space:]]*linux16/{for(i=1;i<=NF;i++) {printf "%s: %d\n",$i,length($i)}}' /etc/grub2.cfg 

(5)、break、continue

  break [n]

  continue ---------------跳过本次循环,直接进入下一次循环

(6)、 next ----------提前结束本行,直接进入下一行

  例:

  # awk -F: '{if($3%2!=0) next;print $1,$3}' /etc/passwd


7、awk命令 ---------------数组

  awk关联数组,使用字符串时,字符串必须使用【双引号】。如果某数组元素事先不存在,当引用该元素时,awk会【自动创建】此元素,并且为该元素赋"空字符串"作为其初始值。

  例:

  # awk 'BEGIN{name["leader"]="zhang";name["mem1"]="li";name["mem2"]="wang";print name["leader"]}'

  # ss -tn | awk '/^ESTAB\>/{print $NF}' | awk -F: '{state[$1]++}END{for(s in state){print state[s],s}}' ------------查看已连接状态下,同一客户端的连接数量





     本文转自little_ding 51CTO博客,原文链接:http://blog.51cto.com/12496428/1966463,如需转载请自行联系原作者






相关文章
|
8天前
|
数据采集 人工智能 安全
|
17天前
|
云安全 监控 安全
|
3天前
|
机器学习/深度学习 人工智能 前端开发
构建AI智能体:七十、小树成林,聚沙成塔:随机森林与大模型的协同进化
随机森林是一种基于决策树的集成学习算法,通过构建多棵决策树并结合它们的预测结果来提高准确性和稳定性。其核心思想包括两个随机性:Bootstrap采样(每棵树使用不同的训练子集)和特征随机选择(每棵树分裂时只考虑部分特征)。这种方法能有效处理大规模高维数据,避免过拟合,并评估特征重要性。随机森林的超参数如树的数量、最大深度等可通过网格搜索优化。该算法兼具强大预测能力和工程化优势,是机器学习中的常用基础模型。
292 164
|
2天前
|
机器学习/深度学习 自然语言处理 机器人
阿里云百炼大模型赋能|打造企业级电话智能体与智能呼叫中心完整方案
畅信达基于阿里云百炼大模型推出MVB2000V5智能呼叫中心方案,融合LLM与MRCP+WebSocket技术,实现语音识别率超95%、低延迟交互。通过电话智能体与座席助手协同,自动化处理80%咨询,降本增效显著,适配金融、电商、医疗等多行业场景。
303 155
|
4天前
|
机器学习/深度学习 人工智能 前端开发
构建AI智能体:六十九、Bootstrap采样在大模型评估中的应用:从置信区间到模型稳定性
Bootstrap采样是一种通过有放回重抽样来评估模型性能的统计方法。它通过从原始数据集中随机抽取样本形成多个Bootstrap数据集,计算统计量(如均值、标准差)的分布,适用于小样本和非参数场景。该方法能估计标准误、构建置信区间,并量化模型不确定性,但对计算资源要求较高。Bootstrap特别适合评估大模型的泛化能力和稳定性,在集成学习、假设检验等领域也有广泛应用。与传统方法相比,Bootstrap不依赖分布假设,在非正态数据中表现更稳健。
233 113
|
11天前
|
SQL 自然语言处理 调度
Agent Skills 的一次工程实践
**本文采用 Agent Skills 实现整体智能体**,开发框架采用 AgentScope,模型使用 **qwen3-max**。Agent Skills 是 Anthropic 新推出的一种有别于mcp server的一种开发方式,用于为 AI **引入可共享的专业技能**。经验封装到**可发现、可复用的能力单元**中,每个技能以文件夹形式存在,包含特定任务的指导性说明(SKILL.md 文件)、脚本代码和资源等 。大模型可以根据需要动态加载这些技能,从而扩展自身的功能。目前不少国内外的一些框架也开始支持此种的开发方式,详细介绍如下。
809 6