Unix & Linux的文本处理工具 -- grep, sed & awk

Posted 点融黑帮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unix & Linux的文本处理工具 -- grep, sed & awk相关的知识,希望对你有一定的参考价值。

当大家看到标题时脑中闪过的大概是铺天盖地baidu, google出来的冗余的各类使用介绍,老生常谈希望能让大家对这三个文本工具有新的理解。



1grep


grep不做过多的介绍, 打印出匹配的行, 着重点在于输出结果并不对文本本身做修改。


有个关于grep的小故事, 从sed和grep能追溯到最初的unix行编辑器ed而grep的命名代表 g(全局)/re(正则表达式)/p(打印)正是ed中全局打印行匹配的语法. grep自身的劣势在于无法实现多行匹配, 这时sed和awk相继出现弥补了grep的不足。


2sed和awk的比较


在进入sed的相关讨论之前,先就sed跟awk之间进行简单的比较。


1. 相似性

可使用指定的脚本文件对相应文本进行编辑。

sed -f 'script filename' or stdin

awk -f 'script filename' or stdin

默认全局匹配并且拥有自身的主输入循环。

除去影响控制流的命令或语句(sed中: t,b; awk中continue,break等)默认对文本的每一读取的行依次执行相应的命令或语句。


2. 优劣性

awk相较于文本编辑工具更像是一门语言,awk条件、循环、判断语句有显性的标识(if,while,for...);而sed只存在单一的判断逻辑(参考b label,t label)。


Unix & Linux的文本处理工具 -- grep, sed & awk

(采用nginx的配置文件格式)


取出upstream awk_test对应的配置块:

Solution1:


Unix & Linux的文本处理工具 -- grep, sed & awk


Solution2:


Unix & Linux的文本处理工具 -- grep, sed & awk


相较之下Solution 2不需要复杂的判断,只需通过寻址来匹配并打印相应的文本;Solution 1更适合于进行多行匹配并替换。另一方面,Solution 1中sed通过创建多行空间模式并输出,而awk通过修改记录分隔符来实现多行匹配的不同。


awk拥有系统变量(FS,RS,OFS,ORS...)、内置函数、数组数据结构、传参(-v var=value)、引用系统命令(通过system() getline() close()函数)等。


Unix & Linux的文本处理工具 -- grep, sed & awk

(点击查看大图)


awk除去主输入循环还存在BEGIN和END过程,用于某些在处理输入之前或者处理输入完成之后的操作。


Unix & Linux的文本处理工具 -- grep, sed & awk

(点击查看大图)


sed也有过人之处,如果对sed的工作模式进行深入了解,会发现有一个叫做保持空间(hold space)的东西,下图大体描述了sed的工作模式,并且阐述了模式空间(pattern space)跟保持空间(hold space)之间的联系。模式空间跟保持空间中的内容可进行删除,交换等。


Unix & Linux的文本处理工具 -- grep, sed & awk


Unix & Linux的文本处理工具 -- grep, sed & awk


sed的指令集都是单一的字母,并且有option可直接修改文件。而awk可能需要指定内置变量的值,或是通过输出重定向保存为新的文件。


Unix & Linux的文本处理工具 -- grep, sed & awk

(点击查看大图)


结语

综上所述:

  • grep适用于单行匹配打印的场景;

  • sed适用于多行模式的替换的场景;

  • awk适合更多的逻辑表达式并输出的场景。


但三个命令都需要文本格式统一化的大前提,对于一个文本中的多种格式,可以先将同一种格式的内容整理到文件中,再将其他格式再分别整理到新的文件中。


统一文本格式固然重要,能准确匹配意图的正则表达式也必不可少,这也是大家头疼的部分。如若有机会,我会再跟大家介绍文本匹配中磨人的小妖精——正则表达式。它在不同的命令中、语言中支持不同的标准,更易于与Unix-like系统的file globbing混淆,常常让人咬牙切齿,欲罢不能。






以上是关于Unix & Linux的文本处理工具 -- grep, sed & awk的主要内容,如果未能解决你的问题,请参考以下文章

在Linux/Unix系统下用iconv命令处理文本文件中文乱码问题

linux 常用工具总结sed 工具使用总结

DOS和UNIX文本文件之间相互转换的方法&批量

Shell学习:sed & gawk

Shell学习:sed & gawk

Shell学习:sed & gawk