Unix命令行下输入的命令是文本,输出也都是文本。因此,掌握Unix文本处理工具是很重要的一种能力。awk是Unix常用的文本处理工具中的一种,它是以其发明者(Aho,Weinberger和Kernighan)的名字首字符命名的,是一种基于模式匹配检查输入然后将期望的匹配结果处理后输出到屏幕的文本数据处理工具。
1、awk命令格式
awk ‘模式 {操作}’ 文件1 文件2 ……
awk命令的工作过程是这样的:对于每一个输入文件,逐行对其进行检查,如果该行和awk命令参数的‘模式’部分匹配,则对该行执行命令参数‘{操作}’部分所代表的操作。下面是一个简单的例子:
$cat awk_test.txt 1 a a,b,d,f 2 b alsdjf,apple,kdjf 3 c 163.2.201.1 4 d www.google.com 5 e http://blog.csdn.net/xia7139 $awk 'NR==1{print}' awk_test.txt 1 a a,b,d,f
上面的例子中,用awk命令输出了awk_test.txt文件的第一行,其中命令的模式部分所用的NR是awk命令的内建变量,代表文件的行号。这样,便可以对所有行号为1的行进行打印输出。
2、常用的内建变量
变量 | 含义 |
NR | 当前处理行的行号 |
FS | 字段分隔,默认为空格或TAB |
$n | 当前处理行的第n个字段 |
$0 | 当前处理行的全部内容 |
这里要解释下字段的含义:在awk的使用中,字段分隔符将文件的一行分隔为各个部分,每一个部分称为一个字段,从左到右分别为第1个字段,……,第n个字段,其中,第0个字段是指这一整行。字段分隔符如果没有特殊指定,则默认为空格或tab制表符。
3、几个例子及其输出
下面的例子都是对上文中的awk_test.txt文件的操作。
按行号操作: (1)打印文件的1-3行 $awk 'NR==1,NR==3{print}' awk_test.txt 1 a a,b,d,f 2 b alsdjf,apple,kdjf 3 c 163.2.201.1 (2)打印文件的第1行和第3行 $awk 'NR==1||NR==3{print}' awk_test.txt 或者是 $awk '(NR==1)||(NR==3){print}' awk_test.txt 1 a a,b,d,f 3 c 163.2.201.1 (3)只打印奇数行(偶数行) $awk '(NR%2)==1{print}' awk_test.txt 1 a a,b,d,f 3 c 163.2.201.1 5 e http://blog.csdn.net/xia7139 $awk '(NR%2)==0{print}' awk_test.txt 2 b alsdjf,apple,kdjf 4 d www.google.com 使用正则表达式: (1)打印包含2的行 $awk '/2/{print}' awk_test.txt 2 b alsdjf,apple,kdjf 3 c 163.2.201.1 (2)打印以com结尾的行 $awk '/com$/{print}' awk_test.txt 4 d www.google.com 指定分隔,输出指定字段: (1)打印第1-3行的第一个字段和第三个字段 $awk 'NR==2,NR==3{print $1,$3}' awk_test.txt 1 a,b,d,f 2 alsdjf,apple,kdjf 3 163.2.201.1 (2)指定分隔符为.,输出第二个字段为csdn的行的第三个字段和整行 $awk -F. '$2=="csdn"{print $3,$0}' awk_test.txt net/xia7139 5 e http://blog.csdn.net/xia7139