awk命令结构/内置变量/获取文本某行或某列

  • 2019 年 10 月 4 日
  • 笔记

awk脚本基本结构

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

一个awk脚本通常由:BEGIN语句块、能够使用模式匹配的通用语句块、END语句块3部分组成,这三个部分是可选的。任意一个部分都可以不出现在脚本中,脚本通常是被单引号或双引号中,例如:

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

awk的工作原理

awk 'BEGIN{ commands } pattern{ commands } END{ commands }'

第一步:执行BEGIN{ commands }语句块中的语句;

第二步:从文件或标准输入(stdin)读取一行,然后执行pattern{ commands }语句块,它逐行扫描文件,从第一行到最后一行重复这个过程,直到文件全部被读取完毕。

第三步:当读至输入流末尾时,执行END{ commands }语句块。

BEGIN语句块在awk开始从输入流中读取行之前被执行,这是一个可选的语句块,比如变量初始化、打印输出表格的表头等语句通常可以写在BEGIN语句块中。

END语句块在awk从输入流中读取完所有的行之后即被执行,比如打印所有行的分析结果这类信息汇总都是在END语句块中完成,它也是一个可选语句块。

pattern语句块中的通用命令是最重要的部分,它也是可选的。如果没有提供pattern语句块,则默认执行{ print },即打印每一个读取到的行,awk读取的每一行都会执行该语句块。

示例

echo -e "A line 1nA line 2" | awk 'BEGIN{ print "Start" } { print } END{ print "End" }'  Start  A line 1  A line 2  End

当使用不带参数的print时,它就打印当前行,当print的参数是以逗号进行分隔时,打印时则以空格作为定界符。在awk的print语句块中双引号是被当作拼接符使用,例如:

echo | awk '{ var1="v1"; var2="v2"; var3="v3"; print var1,var2,var3; }'  v1 v2 v3

双引号拼接使用:

echo | awk '{ var1="v1"; var2="v2"; var3="v3"; print var1"="var2"="var3; }'  v1=v2=v3

{ }类似一个循环体,会对文件中的每一行进行迭代,通常变量初始化语句(如:i=0)以及打印文件头部的语句放入BEGIN语句块中,将打印的结果等语句放在END语句块中。

awk内置变量(预定义变量)

说明:[A][N][P][G]表示第一个支持变量的工具,[A]=awk、[N]=nawk、[P]=POSIXawk、[G]=gawk

$n 当前记录的第n个字段,比如n为1表示第一个字段,n为2表示第二个字段。  $0 这个变量包含执行过程中当前行的文本内容。  [N] ARGC 命令行参数的数目。  [G] ARGIND 命令行中当前文件的位置(从0开始算)。  [N] ARGV 包含命令行参数的数组。  [G] CONVFMT 数字转换格式(默认值为%.6g)。  [P] ENVIRON 环境变量关联数组。  [N] ERRNO 最后一个系统错误的描述。  [G] FIELDWIDTHS 字段宽度列表(用空格键分隔)。  [A] FILENAME 当前输入文件的名。  [P] FNR 同NR,但相对于当前文件。  [A] FS 字段分隔符(默认是任何空格)。  [G] IGNORECASE 如果为真,则进行忽略大小写的匹配。  [A] NF 表示字段数,在执行过程中对应于当前的字段数。  [A] NR 表示记录数,在执行过程中对应于当前的行号。  [A] OFMT 数字的输出格式(默认值是%.6g)。  [A] OFS 输出字段分隔符(默认值是一个空格)。  [A] ORS 输出记录分隔符(默认值是一个换行符)。  [A] RS 记录分隔符(默认是一个换行符)。  [N] RSTART 由match函数所匹配的字符串的第一个位置。  [N] RLENGTH 由match函数所匹配的字符串的长度。  [N] SUBSEP 数组下标分隔符(默认值是34)。
1、打印文件的第一列(域):  awk '{print $1}' filename  2、打印文件的前两列(域):  awk '{print $1,$2}' filename  3、打印完第一列,然后打印第二列:  awk '{print $1 $2}' filename  4、打印文本文件的总行数:  awk 'END{print NR}' filename  5、打印文本第一行:  awk 'NR==1{print}' filename  6、打印文本第二行第一列:  sed -n "2, 1p" filename | awk 'print $1'  7、打印文件的最后一行  awk 'END{print}'  或 tail -1 file

shell里面的赋值方法有两种,格式为

1) arg=`(命令)`  2) arg=$(命令)  因此,如果想要把某一文件的总行数赋值给变量nlines,可以表达为:  1) nlines=`(awk 'END{print NR}' filename)`  或者  2) nlines=$(awk 'END{print NR}' filename)