介绍
awk是Linux上的一款文本处理器。通过awk,可以实现根据文本执行相应的指令。
基本语法
$ awk [option] 'pattern {action}' test.txt
基本的用法是读取test.txt中的每一行。对于每一行,对于pattern匹配的文本,执行action。
下面用几个简单的例子介绍该基本用法。
示例1——打印文本
以下是一个例子:
book.txt:
book publisher price
apue pearson 100
csapp pearson 80
执行 awk '{print $2}' book.txt
的结果为:
publisher
pearson
pearson
其实就是对于每一行,以空格作为分隔,分割为多个field。然后将每一行的第二个field给打印出来。{print $2}
即为打印的具体action。
示例2——根据pattern打印文本
在上一个示例中,我们并没有使用到pattern。在本示例中,我们不打印抬头行,即只打印第二行之后的内容。命令如下:
awk 'NR > 1 {print $0} book.txt'
结果为:
apue pearson 100
csapp pearson 80
这里NR是awk的内置变量,代表”the number of row”。awk内还有更多的内置变量,如FNR(NR in file,文件中的行数)、NF(number of field,该行含有field的个数)、FS(file seperator, 文件分隔符,默认为空格,可以通过选项-F指定)。
$0是指这行的所有field。
awk的pattern不仅支持逻辑表达式,也支持正则表达式。例如下面的是打印出价格在10-99元的书:
awk '$3 ~ /^[1-9][1-9]$/ {print $0}' awk.txt
结果为:
csapp pearson 80
这里~
为匹配操作符,$3 ~ /^[1-9][0-9]$/
匹配第三个field能够匹配正则表达式^[1-9][0-9]$
的行。正则表达式需用/xxx/
表示。需要指出的是,在awk中正则表达式的匹配是全局匹配,即寻找到一个子串符合表达式即为匹配。
awk中的pattern支持&&和||等与或非逻辑,例如:里
awk '$3 ~ /^[0-9]{1}[0-9]{1}$/ && $2 == "pearson" {print $0}' awk.txt
意为找出价格在10-99元之间且出版商为pearson的图书。
选项
-F: 选择文本分隔符,默认为空格
例如,对于文件
book|publisher|price
apue|pearson|100
csapp|pearson|80
我们可以使用命令awk -F "|" '$3 ~ /^[1-9][0-9]$/ {print $3}' book.txt
实现示例2中的功能。
-v var=value: 设定变量值以在awk中使用。可以多次使用以设置多个变量值。
例如:执行awk -v a=1 '{print a}'
的结果为:
1
-f progfile: 运行指定的awk脚本。脚本的写法将在以后介绍。
action
action可以写成形如C语言的语句。例如:
awk -F "|" -v a=2 -v b=3 '{printf("a=%d\t",a);printf("b=%d\n", b)}' book.txt
的结果为:
a=2 b=3
未完待续。