西数超哥博客
运维经验教程分享

【原创】shell脚本学习第八天(awk用法)

awk被设计用于数据流,能够对列和行进行操作,可以看做最强大的数据流处理工具。而sed更多的是匹配,进行替换和删除。
awk有很多内建的功能,比如数组,函数等。灵活性是awk的最大优势。 

awk的结构

awk 'BEGIN{ print "start"}  pattern { commands }  END{ print "end"}'   file

一个awk脚本通常是3部分
1. BEGIN语句块
2. 能够使用模式匹配的通用语句块
3. END语句块
他们任何一部分都可以不出现在脚本中。脚本通常包含在双引号或者单引号内。
例如:

awk 'BEGIN{i=0}{i++}END{print i}' filename  

 工作原理

awk命令的工作方式如下:

1. 执行BEGIN{commands}语句块中的语句
2. 从文件或者stdin中读取一行,然后执行pattern{commands}. 迭代(一行一行的处理)直到全部读取完毕
3. 最后执行END{commands}语句块

再次提醒,他们任何一步都可以没有,awk的功能也远不止如此

入门实例:

  1. echo | awk ‘{var1=“v1”;var2=“v2”;var3=“v3”; print var1,var2,var3;}’  
  2. 打印: v1 v2 v3  

解释:逗号为定界符(分隔符) 

  1. echo | awk ‘{var1=“v1”;var2=“v2”;var3=“v3”; print var1″-“var2”-“var3;}’ 

打印v1-v2-v3

解释:双引号为连接符

其他任何符号,都不能正常输出v1,v2,v3

部分特殊内置变量:

NR: 表示记录数量,在执行过程中对应于行号(numeber of recording)
NF:表示字段数量,在执行过程中对应于当前行的字段数(number of filed)
$0: 这个变量包含执行过程中当前行的文本内容,即整行
$1: 第一个字段的文本内容
$2: 第二个字段的文本内容

 

例子:

例1.

  1. echo -e “line1 f2 f3\nline2 f4 f5\nline3 f6 f7″|\#这个\是在窗口中写多行命令用的  
  2. awk ‘{  
  3. print “Line no:”NR”,No of fields:”NF, “$0=“$0,”$1=“$1,”$2=“$2,”$3=”$3  
  4. }’  

小注一下:$1是打印第一个,$NF打印最后一个字段,$(NF-1)打印倒数第二个

 例2.

  1. seq 5 | awk ‘BEGIN{ sum=0;print “Summation:”}{print $1″+”;sum+=1}END{print “==”;print sum}’ 

这个例子用到了基本格式。
BEGIN中 初始化了sum,打印Summation
中间模块打印了第一列,然后给sum+1,END中打印了sum

 例3. 关于-v 外部变量 

  1. VAR=10000 
  2. $echo | awk –v VARIABLE=$VAR'{print VARABLE}’ 

还有另一种灵活的方法可以将多个外部变量传递给awk,例如:

  1. $var1=“value1” var2=“value2” 
  2. $echo | awk ‘{print v1,v2}’ v1=$var1 v2=$var2 

如果来自文件

  1. awk ‘{print v1,v2}’ v1=$var1 v2=$var2 filename 

 例4

$awk ‘NR < 5’ #行号小于5
$awk ‘NR==1,NR==4’ #行号在1到5之间的行 ,这种写法很多,比如awk ‘NR<6’ 或者awk ‘NR>=1&& NR<6’等等
$awk ‘/linux/’ #包含样式linux的行(可以用正则表达式指定样式)
$awk ‘!/linux/’ #不包含样式linux的行

转载请注明:西数超哥博客www.ysidc.top» 【原创】shell脚本学习第八天(awk用法)

https://www.ysidc.top 西数超哥博客,数据库,西数超哥,虚拟主机,域名注册,域名,云服务器,云主机,云建站,ysidc.top

赞(0)
声明:本站发布的内容(图片、视频和文字)以原创、转载和分享网络内容为主,若涉及侵权请及时告知,将会在第一时间删除。本站原创内容未经允许不得转载:西数超哥博客 » 【原创】shell脚本学习第八天(awk用法)