awk命令
简介
awk是一个强大的文本分析工具,功能强大,具备完整的编程特性,若与SQL进行类比,它相当于SQL的select field from table,可以进行数据切片。简单来说,awk就是把文件逐行读入,以空格为默认分隔符将每行切片,然后可以对切开的部分进行各种处理。
相对于grep的查找、匹配和sed的编辑,awk适合对文本进行较复杂的格式处理。
基本语法
awk [options] ‘{pattern + action}’ {filenames}
options 指命令的选项;
pattern 指匹配条件;
action 指对匹配成功的文本进行处理;
filenames 指查找的文件;
awk语言最基本的功能是在文件或者字符串中基于指定规则浏览和抽取信息,信息抽取后,才能对其进行操作。完整的awk脚本通常用来格式化文本文件中的信息。
hello.txt文件的内容如下:
1 使用awk最基本的功能,打印内容
不使用options、pattern,直接执行action
awk的工作流程:读入有’\n’换行符分割的一条记录,然后按指定的域分隔符划分域(默认分隔符为空格或tab键),$0表示所有域, $1表示第一个域,$n表示第n个域。
图中命令的功能是按行读取hello.txt文件中的内容,并以空格将每一行进行划分,action为print $1,即打印分割后的第一个域。
也可以一次性打印多列,可以用逗号","或其他符号分割,示例使用tab键分割
⚠️命令中的tab符号\t要用双引号分隔开;
2 指定分隔符,并添加列名与结束行
把hello.txt文件稍微修改一下:
awk工作流程:
1)执行BEGIN后面的语句{print “column1,column2”}
2)读取文件,读入有’\n’换行符分割的一条记录,然后将记录按指定的分隔符(:)进行划分(option为-F ‘:’,即指定划分分隔符),action为{print $1","$2},即打印划分后的第一个域和第二个域,接着开始读入第二条记录…,直到所有的记录都读完
选项-F用于指定输入分隔符
3)执行END操作;
除了使用-F选项来指定分隔符,还能够通过设置内部变量的方式来指定分隔符,但是在使用FS变量时,需要使用-v选项(-v选项主要用于设置变量的值),用于指定对应的变量。
3 搜索指定关键字的记录
可以指定关键字对文件进行搜索
awk内置变量
前面的例子有使用FS内置变量,主要用于指定分隔符;
awk有很多内置变量用来设置环境信息,下面列出一些常用的变量:
ARGC 命令行参数个数
ARGV 命令行参数排列,是一个数组
ENVIRON 支持队列中系统环境变量的使用
FILENAME awk浏览的文件名
FNR 浏览文件的记录数,即各文件分别计数的行号
FS 设置输入域分隔符,默认为空白字符
NF 当前记录的域的个数,即当前行被分割成几列
NR 已读记录个数,行号,即当前处理的文本行的行号
OFS 输出域分隔符,默认为空白字符
ORS 输出记录分隔符,输出时用指定的符号代替换行符
RS 输入记录分隔符,指定输入时的换行符
输出分隔符OFS
当awk为我们输出每一列的时候,默认会使用空格隔开每一列,这里的空格就是awk默认的输出空格符,这里的print语句中逗号没有用双引号,表明这只是print语句的一部分,而不是输出的内容。
这里我们可以用awk的内置变量OFS输出分隔符来设定awk的输出分隔符,指定变量的时候需要配合使用-v选项,示例如下:
若要使列合并在一起输出,没有输出间隔符,可以使用以下方式,即print语句中不使用逗号:
内置变量NR与NF
内置变量NR表示每一行的行号,而NF表示每一行一共被划分为几列,示例如下
内置变量FNR
当使用awk同时处理多个文件,并想要分别显示每个文件的行号,可以使用内置变量FNR,示例如下:
从返回结果可以看出,内置变量FNR会按照顺序将文件的行号依次进行排序。
内置变量RS与ORS
RS是输入行分隔符,若不指定,默认是回车换行符,当然可以通过RS变量来设定分隔符,比如使用:引号,示例如下:
输出内容时,默认是以回车换行作为输出分隔符,也可以使用ORS变量设定输出分隔符,示例如下:
从结果可以看出,每一条记录之间使用设定的’+++'来连接,而不是换行。
内置变量FILENAME
变量FILENAME就是显示文件名,示例如下:
内置变量ARGV与ARGC
ARGV变量表示的是一个数组,这个数组保存的是命令行所给的参数,下标从0开始,示例如下:
由上两图可以看出,ARGV是一个数组,第一个参数是awk命令本身,而options、'pattern {action}'不被作为参数。
ARGC变量是指命令行参数的个数,即ARGV数组的长度,示例如下:
awk自定义变量
awk除内置的变量之外,还可以自定义变量。
有两种方式来自定义变量:
1)使用 -v varname=value 变量名区分字符大小写
2)在program中直接定义
示例如下:
第一种方法
当然,也可以在命令行定义变量,只是要引用的时候需要使用$符号:
第二种方法
第二种方法需要注意的是定义的变量之间要使用分号;来分隔开,而打印的时候用逗号。