在上一篇学习sed的基础上,本篇提到的是比sed更高级更好使用的工具(其实awk是一种像shell的但更加复杂的脚本语言)------awk和sed都是以行为单位处理文件的,而awk的优势在于,它不仅能以行进行处理,还能以列为单位处理文件,awk缺省的行分隔符为换行,缺省的列分隔符为连续的空格和Tab,当然这里的行或者列分隔符都可以自行定义。awk中每行的内容就属于一条记录,那当然记录分隔符为换行符。
1.awk命令行的基本形式:awk +选项+'描述' +文件名
或者 awk+选项 -f +描述 +文件名
awk和sed工具一样,它处理的文件既可以由标准输入重定向得到,也可以当命令行参数传入,编辑命令可以直接作为命令行参数传入,也可以使用-f参数指定一个脚本文件,编辑命令的格式为:
/pettern/{actions} 或者 condition{actions},其中pattern是正则表达式,actions是一系列的操作。一般匹配正则表达式的时候,若不满足条件,则立即丢弃,按照行(列)继续查找。
2.前面提到了awk可以按照列来处理文本,那么怎样来取出我们想要的列呢?$0:表示整个当前行 $1、$2:分别表示第一列,第二列,剩下的列以此类推。(如下例子)
3,awk的有些语法使用和C语言在一些程度上还是很具有共同点的,其中使用的printf函数就是有代表意义的一个。awk命令的condition部分可以是两个特殊的BEGIN和END语句,这两个语句各自在前/后被执行一次(用法特别相似于c++中构造函数和析构函数的使用)。(例子如下,统计一个文件中空行数)
4.awk的调用方式
(1)命令行方式:awk -F +命令+文件
文件的每一行,由域分隔符分开的每一项称为一个域,在不指明-F域分隔符的情况下,默认的域分隔符为空格。
(2)前面已经说过awk是一种复杂的脚本语言,那么自然我们可以将所有的命令插入一个文件,并使awk程序可执行,然后awk命令解释器作为脚本的首行,一般通过键入脚本名称来调用。(例子如下)
文件file:
脚本count.awk
当然除过上面的调用方式,我们还可以在命令行上直接使用命令:chomd u+x 脚本(修改权限)后执行该命令:awk -f +脚本 即可运行
5.awk调用正则表达式方法:
(1)awk '/pattern/{action}':这条语句表示可以将$0 中满足正则表达式的进行action处理(例子如下)
(2)awk正则表达式语句(~,~!的作用等同于!~)(例子如下)
从上面的这个例子可以看出:~!表示不匹配正则表达式,直接执行花括号中的打印语句;~表达匹配正则表达式;!~表示不匹配以正则表达式开头的语句。
6.awk的内置变量和一些其他选项
ARGV :命令行参数
ENVIRON:支持系统中环境变量的使用
FILENAME:awk浏览的文件名
FNR:浏览文件的记录数
FS:设置域分隔符,等价于命令行 -F选项
NF:浏览记录的域的个数
NR:已读的记录数
OFS:输出域分隔符
ORS:输出记录空格符
RS:控制记录分隔符
上图中第二个命令执行后打印出来文件名file,但它的个数为什么会那么多呢?那是因为该awk是按照行查找的,所以文本有几行,那么最后打印出来的文件名就有几行。而第三个命令则是我们自行设置了域分隔符和输出分隔符。