linux awk命令详解
标签(空格分隔): Linux
awk介绍
awk是一个强大的文本分析工具,相对于grep的查找,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切成的部分再进行各种分析处理。
awk的最基本功能是在文件中或者字符串中基于指定规则浏览和抽取信息,awk抽取信息后,才能进行其他文本操作。完成的awk脚本通常用来格式化文本文件中的信息。
- awk是以行为处理单位: awk根据pattern读取到文件每行,然后执行action来处理文本
- awk通常是用来格式化文本文件中的信息
使用方式
awk '{pattern + action}' {filename}
或
awk 'BEGIN{ print "start" } pattern{ commands } END{ print "end" }' fileName
一个awk脚本通常由:BEGIN语句块、能够使用模式匹配的统一语句块、END语句块3部分组成,这三个部分都是可选的。
- 第一步:执行
BEGIN {commands}
语句块中的语句; - 第二步:从文件或标准输入(stdin)读取一行,然后执行'pattern{commands}'语句块,它逐行扫描文件,从第一行到最后一行重复这个过程,直到文件全部被读取完毕。
- 第三步:当读至输入流末尾,
END{commands}
语句块。
-
BEGIN语句块在awk开始从输入流中读取之前被执行,可选,通常用于变量初始化、打印输出表格的表头等操作。
-
END语句块在awk从输入流中读取完所有的行之后被执行,通常打印所有行的分析结果等。
-
pattern语句块中的通用命令是最重要的部分,它也是可选的。如果没有提供pattern语句块,则默认执行
{print}
,即打印每一个读取到的行,awk读取的每一行都会执行该语句块。
调用awk
- 命令行方式:
awk [-F field-separator] 'commands' input-file(s)
-
shell脚本方式
将所有的awk命令插入一个文件,并使程序可执行,然后awk命令解释器作为脚本的首行。相当于shell脚本首行的:#!/bin/sh 可以换成: #!/bin/awk -
将所有的awk命令插入一个单独文件,然后调用:
awk -f awk-script-filename input-file(s)
awk pattern和action
- pattern 模式可以是以下任意一个:
- /正则表达式/:使用通配符的扩展集。
- 关系表达式:使用运算符进行操作,可以是字符串或数字的比较测试。
- 模式匹配表达式:用运算符
~
(匹配)和!~
(不匹配) - BEGIN语句块、pattern语句块、END语句块。
- action 操作由一个或多个命令、函数、表达式组成,之间由换行符或分号隔开,并位于大括号内。
awk内置变量
ARGC 命令行参数个数
ARGV 命令行参数排列
ENVIRON 支持队列中系统环境变量的使用
FILENAME awk浏览的文件名
FNR 浏览文件的记录数
FS 设置输入域分隔符,等价于命令行 -F选项
NF 浏览记录的域的个数
NR 已读的记录数
OFS 输出域分隔符
ORS 输出记录分隔符
RS 控制记录分隔符
此外,$0
变量是指整条记录。$1
表示当前行的第一个域,$2
表示当前行的第二个域..... , 以此类推。同时,使用$NF
可以表示最后一个字段,使用$(NF-1)
则是打印倒数第二个字段,其他也是以此类推。
print和printf
print函数的参数可以是变量,数值或者字符串。
printf提供了格式化的打印输出。