关于AWK是我在一篇博客上看到的。当然那个博主也是一个牛人,这里是传送门:我的大学-徐宥
AWK其实是Unix/Linux下处理文本的一门语言,语言的名字来自于三位创始人姓氏的首字母。都是贝尔实验室的。三位分别是:阿尔佛雷德·艾侯、彼得·温伯格和布莱恩·柯林 其中最后一位是圣经:C Progarmming Language的作者。
AWK是用于处理文本的编程语言工具。一般情况下,它把输入序列分别一条条记录,其中默认的分隔符为换行符;而每一行又会被分为一些域,默认的域分割符为空格或者Tab。
AWK程序由一系列的模式-动作对组成。这里类似于数据结构中的关联数组Key—-Value写做:
pattern { action }
其中Pattern表示要匹配的模式,如果某个记录(即一般某行)匹配制定的模式,便执行相应的动作。当然,pattern和action都可以省略不行,无pattern则默认匹配全部的记录。无action则是打印全部记录。
下面是几个简单的示例。(我也是初学,欢迎拍砖)
假设现在宥一个employee的文件,内容如下:
ID Name Position Department Salary
100 Thomas Manager Sales $5,000
200 Jason Developer Technology $5,500
300 Sanjay Sysadmin Technology $7,000
400 Nisha Manager Marketing $9,500
500 Randy DBA Technology $6,00
打印其中的第二条和第四条记录
awk '{ print $2,$4 }' employee
效果如下:
Name Department
Thomas Sales
Jason Technology
Sanjay Technology
Nisha Marketing
Randy Technology
查找其中的Nisha和Jason
awk '/Nisha/ , /Jason/' employee
效果如下:
400 Nisha Manager Marketing $9,500
500 Randy DBA Technology $6,00
查找其中大于属于Manager 或者 Developer 且薪水不等于$5000
awk ' ($3=="Manager" || $3=="Developer") && $5!="$5,000" ' employee
结果如下:
200 Jason Developer Technology $5,500
400 Nisha Manager Marketing $9,500
打印Jason的部门
awk 'NR==3 { print $4 } ' employee
输出如下:
Technology
其中NR是内置变量,表示已经读入的记录数,即行数。一部分内置变量及作用如下:
NR:已输入记录的条数。
NF:当前记录中域的个数。记录中最后一个域可以以$NF的方式引用。
FILENAME:当前输入文件的文件名。
FS:“域分隔符”,用于将输入记录分割成域。其默认值为“空白字符”,即空格和制表符。FS可以替换为其它字符,从而改变域分隔符。
RS:当前的“记录分隔符”。默认状态下,输入的每行都被作为一个记录,因此默认记录分隔符是换行符。
OFS:“输出域分隔符”,即分隔print命令的参数的符号。其默认值为空格。
ORS:“输出记录分隔符”,即每个print命令之间的符号。其默认值为换行符。
OFMT:“输出数字格式”(Format for numeric output),其默认值为"%.6g"。
除了以命令行的方式之外,我门还可以写一个awk的脚本然后键入相应的命令运行。假设现在有一个FilewOwner的程序(打印当前目录下的文件和它的拥有者)
可以编写一个如下的脚本:
!/bin/awk -f
#Unix users have to change $9 to $8
BEGIN{ printf "%-20s %-20s\n","File","Owner" }
#running
{ printf "%-20s %-20s\n",$9,$3 }
#Ending
END{ print "--Done--" }
键入如下两个命令
ls -l > FileOwner
awk -f FileOwner.awk FileOwner
输出如下:
File Owner
employee mark
FileOwner mark
FileOwner.awk mark
statis.awk mark
The_Kite_Runner mark
--Done--
其中BEGIN END是AWK的内置关键字
BEGIN{} //表明执行前 执行的语句
{......} //要执行的语句
END{......} //执行后的语句
其中-f
参数表明这是一个awk文件 FileOwner是一个输入数据
printf 看到了么? 简直和C语言的printf没什么区别
以上
参考资料:
http://www.grymoire.com/Unix/Awk.html#uh-2
http://coolshell.cn/articles/9070.html
https://zh.wikipedia.org/wiki/Awk
http://www.thegeekstuff.com/2010/01/awk-introduction-tutorial-7-awk-print-examples/