初识AWK

关于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脚本

除了以命令行的方式之外,我门还可以写一个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/

你可能感兴趣的:(awk,脚本语言,脚本编程语言)