- 简介
- 第一章 - 关于 CD
- 第二章 - 基本命令
- Hack-7 Grep
- Hack-8 Grep 与正则表达式
- Hack-9 Find 命令
- Hak-10 重定向
- Hack-11 Join 命令
- Hack-12 Tr 命令
- Hack-13 Xargs 命令
- Hack-14 Sort 命令
- Hack-15 Uniq 命令
- Hack-16 Cut 命令
- Hack-17 Stat 命令
- Hack-18 Diff 命令
- Hack-19 Ac 命令
- Hack-20 让命令在后台执行
- Hack-21 Sed 替换基础
- Hack-22 Awk 简介
- Hack-23 VIM 基本入门
- Hack-24 Chmod 命令
- Hack-25 Tail -f -f
- Hack-26 Less 命令
- Hack-27 Wget 下载器
- 第三章 - SSH 技巧
- 第四章 - 日期设置
- 第五章 - PS* 介绍
- 第六章 - 压缩和打包
- 第七章 - 历史命令
- 第八章 - 系统任务管理
- 第九章 - 安装软件
- 第十章 - LAMP 套装
- 第十一章 - Bash 脚本
- 第十二章 - 系统性能监控
- 第十三章 - 额外的技巧
Hack-22 Awk 简介
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 能做的可不是这么简单. :)
(我也只是学了点皮毛...)
扩展阅读
(这些扩展阅读也都是原作者自己写的,很厉害的一个家伙!
本书简介:
- Linux 进阶技巧
- 巧妙的命令组合
- Bash 某些技巧
- 一共一百零一个(包括充数的)
- 最后有个奖励章(额外技巧)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论