awk
是Linux/Unix下强大的文本处理工具,1977年诞生于AT&T贝尔实验室。发展至今,现在最常用的实现是gawk
。
我们知道,sed
以行为单位处理文件, awk
比sed
强的地方在于不仅能以行为单位还能以列为单位处理文件。awk
默认的行分隔符是换行符,默认的列分隔符是连续的空格或Tab制表符,行分隔符和列分隔符都可以自定义,比如/etc/passwd
文件的每一行有若干个字段,字段之间以:
分隔,此时就可以重新定义awk
的列分隔符为:
并以列为单位处理这个文件。
awk
实际上是一门很复杂的脚本语言,还有像C语言一样的分支和循环结构,但是基本用法和sed
类似,awk
命令行的基本形式为:
awk option 'script' file1 file2 ...
awk option -f scriptfile file1 file2 ...
注意:具体的命令脚本必须使用单引号。
和sed
一样,awk
处理的文件既可以由标准输入重定向得到,也可以当命令行参数传入,编辑命令可以直接当命令行参数传入,也可以用-f
参数指定一个脚本文件,编辑命令的格式为:
/pattern/{actions}
condition{actions}
sed
类似,pattern
是正则表达式,actions
是一系列操作。awk
程序一行一行读出待处理文件,如果某一行与pattern
匹配,或者满足condition
条件,则执行相应的actions
,如果一条awk
命令只有actions
部分,则actions
作用于待处理文件的每一行。自动变量$1
、$2
分别表示第一列、第二列等,类似于Shell脚本的位置参数,而$0
表示整个当前行。
awk '{print $2;}' testfile
awk
也有和C语言非常相似的printf
函数。
awk '$2<75 {printf "%s\t%s\n", $0, "REORDER";} $2>=75 {print $0;}' testfile
awk
命令的condition
部分还可以是两个特殊的关键字:BEGIN
和END
,对于每个待处理文件,BEGIN
后面的actions
在处理整个文件之前执行一次,END
后面的actions
在整个文件处理完之后执行一次。
awk
命令可以像C语言一样使用变量(但不需要定义变量),比如统计一个文件中的空行数:
awk '/^ *$/ {x=x+1;} END {print x;}' testfile
```
## 常用内建变量
![](.res/1.png)
下面例子中,我们打印系统中的帐号列表:
```bash
awk 'BEGIN {FS=":"} {print $1;}' /etc/passwd