Awk 简介
简介
Awk stands for the names of its authors “Aho, Weinberger, and Kernighan”
Awk也是一种编程语言, 他能让你格式化数据以及生成特定格式的报告.(翻译的好糙…)
总之, 你只需要记住它是用来格式化数据的就OK了.
Awk
更像是一个过滤器, 它把读入的数据一行一行的过滤, 匹配你想要的内容, 如果匹配到了, 那就格式化输出, 匹配不到的就忽略.
Awk
有一些特性:
- 它把数据视为 '记录' 和 '字段'
- 它也有变量, 条件和循环.
- 它有数学操作符和字符串操作符
- 它能生成格式化的报告
- 它从标准输入读取数据, 把过滤之后的数据从标准输出打印出来, 不处理空文件.
基本语法:
awk '/search pattern1/ {Actions} /search pattern2/ {Actions}' file
其中:
search pattern
是要匹配的字符串Actions
是匹配到之后所进行的动作- 它能处理多个匹配和行为
file
是值输入文件- 单引号的作用是防止里面的特殊字符被shell处理
Awk的工作方法
Awk
每次从输入文件中读取一行.- 对于每一行, 如果匹配到了相应的内容, 就会执行相应的动作.
- 如果匹配不到, 就什么也不做.
- 在上面的语法中, 匹配项和动作有一即可.
- 如果没有给出匹配项, Awk就会把每一行按照给定的动作执行
- 如果动作没有给出, 默认是打印.
- 如果大括号里面是空的, 那就什么也不干.(因为这样就代表给出了一个空的动作)
- 在大括号里的每一个动作需要用分号(
;
)隔开.
然后我们开始举栗子:
先是有这样一个文件:
➤ cat awk.txt
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,000
打印每一行
➤ awk '{print;}' awk.txt
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,000
➤
这里我们没有给出匹配项, 仅给出了动作,print
打印.
打印匹配到的行
➤ awk '/Thomas/;/Nisha/' awk.txt
100 Thomas Manager Sales $5,000
400 Nisha Manager Marketing $9,500
这里跟原著有点不太一样, 原著是用回车把每一个要匹配的内容分开的, 但是这样不好修改, 看起来也怪怪的, 所以, 不如直接用分号把他们隔开啦~
上面的栗子打印了匹配到那两个名字的行(记录).
打印特定的字段(列)
这个例子打印了第2和第5个字段.
➤ awk '{print $2,$5}' awk.txt
Thomas $5,000
Jason $5,500
Sanjay $7,000
Nisha $9,500
Randy $6,000
再看下面这个例子:
➤ awk '{print $3,$NF}' awk.txt
Manager $5,000
Developer $5,500
Sysadmin $7,000
Manager $9,500
DBA $6,000
有点不一样了是吧? $NF
的意思是最后一个字段.
每个字段都要用逗号(,
)分开.
开始和结束
awk
有一种特定的语法, 开始和结束.
BEGIN { Actions}
{ACTION} # 文件中的每一行默认的动作
END { Actions }
有什么用呢? 正如表述所言, 开始
定义了输出一开始的动作,而结束
则定义了输出结束时的动作.
比如:
➤ awk 'BEGIN {print "Name\t Designation\tDepartment\tSalary";} {print $2,"\t",$3,"\t",$4,"\t",$NF;} END{print "Report Generated\n--------------";}' awk.txt
Name Designation Department Salary
Thomas Manager Sales $5,000
Jason Developer Technology $5,500
Sanjay Sysadmin Technology $7,000
Nisha Manager Marketing $9,500
Randy DBA Technology $6,000
Report Generated
--------------
如果太长了, 中间可以用回车隔开:
$ awk 'BEGIN {print
"Name\tDesignation\tDepartment\tSalary";}
> {print $2,"\t",$3,"\t",$4,"\t",$NF;}
> END{print "Report Generated\n--------------";
> }' employee.txt
Name Designation Department Salary
Thomas Manager Sales $5,000
Jason Developer Technology $5,500
Sanjay Sysadmin Technology $7,000
Nisha Manager Marketing $9,500
Randy DBA Technology $6,000
Report Generated
--------------
条件语句
awk
也有条件语句, 比如比较大小:
➤ awk '$1 >= 200' awk.txt
200 Jason Developer Technology $5,500
300 Sanjay Sysadmin Technology $7,000
400 Nisha Manager Marketing $9,500
500 Randy DBA Technology $6,000
上面的例子是打印第一个字段大于等于200的行.
再看下面这个例子, 是对字符串进行比较的:
➤ awk '$4 ~ /Tech/' awk.txt
200 Jason Developer Technology $5,500
300 Sanjay Sysadmin Technology $7,000
500 Randy DBA Technology $6,000
有点像[[ ]]
里面的正则匹配, 好像就是正则匹配…
➤ awk '$4 ~ /[tT][abcde]/' awk.txt
200 Jason Developer Technology $5,500
300 Sanjay Sysadmin Technology $7,000
500 Randy DBA Technology $6,000
有点意思了,是吧!
计数!
awk
既然是一种编程语言, 那基本的计数也是应该的:
➤ awk 'BEGIN { count=0;} $4 ~ /Tech/ { count++; } END { print "Number of employees in Technology Dept=",count;}' awk.txt
Number of employees in Technology Dept= 3
➤ awk 'BEGIN { count=0;}
> $4 ~ /Tech/ { count++; }
> END { print "Number of employees in Technology Dept=",count;}' awk.txt
Number of employees in Technology Dept= 3
附言
awk
作为一门编程语言, 这点介绍仅仅是皮毛而已, 就像, 虽然你学了点C语言,能输出个12345了, 可C能做的可不是这么简单. :)
(我也只是学了点皮毛…)
扩展阅读
(这些扩展阅读也都是原作者自己写的, 很厉害的一个家伙!