awk是Linux 系统下的一个强大的文本处理工具,常常和sed、grep一起配合使用。主要功能就是将文本依行读取,然后每行按照一定的分隔符隔开放进一个array里面并提供了函数对这些元素进行一定的处理分析。在awk中,文件的每一行由域分隔符分开,每一项称为一个域。在不指明-F域分隔符的情况下,默认的域分隔符是空格。
三种方式调用awk
命令行方式
$ awk [-F field-separator] 'commands' input-file(s)
其中,commands 是真正awk命令,[-F域分隔符]是可选的。 input-file(s) 是待处理的文件。shell脚本方式
将所有的awk命令插入一个可执行文件,然后把awk命令解释器作为脚本的首行,以便通过键入脚本名称来调用。即将shell脚本首行的:#!/bin/sh
换成:#!/bin/awk
- 将所有的awk命令插入一个单独文件,然后调用:
$ awk -f awk-script-file input-file(s)
其中,-f 选项加载awk-script-file中的awk脚本,input-file(s)跟上面的是一样的。
awk内置变量
awk有许多内置变量用来设置环境信息,这些变量可以被改变,下面给出了最常用的一些变量。
环境变量 | 解释 |
---|---|
ARGC | 命令行参数个数 |
ARGV | 命令行参数排列 |
ENVIRON | 支持队列中系统环境变量的使用 |
FILENAME | awk浏览的文件名 |
FNR | 浏览文件的记录数 |
FS | 设置输入域分隔符,等价于命令行 -F选项 |
NF | 浏览记录的域的个数 |
NR | 已读的记录数 |
OFS | 输出域分隔符 |
ORS | 输出记录分隔符 |
RS | 控制记录分隔符 |
此外, $1变量是指整条记录,$1表示当前行的第一个域,$2表示当前行的第二个域,……以此类推。
awk编程
关于awk的编程,其基本语法如下:
awk -F ':' 'BEGIN '{pattern + action}' '{pattern + action}' END '{pattern + action}'' {input-filenames}
awk工作流程是这样的:先执行BEGING,然后读取文件,读入有/n换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,$0则表示所有域,$1表示第一个域,$n表示第n个域,随后开始执行模式所对应的动作action。接着开始读入第二条记录······直到所有的记录都读完,最后执行END操作。除了awk的内置变量,awk还可以自定义变量。
下面累加 number.txt 的总和为例:
$ cat number.txt
1
2
3
4
5
6
7
7
8
8
8
9
3
2
5
7
8
9
3
5
3
$ awk 'BEGIN {print "Start counting"} {sum+=$0;} END {print "Sum is ", sum}' number.txt
Start counting
user count is 40
sum是自定义变量,之前的action{}里都是只有一个print,其实print只是一个语句,而action{}可以有多个语句,以;号隔开。
更多用法可以参见官网:
http://www.gnu.org/software/gawk/manual/gawk.html