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

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

AAffA0nNPuCLAAAAAElFTkSuQmCC

1、grep

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

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

2、sed和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)。

AAffA0nNPuCLAAAAAElFTkSuQmCC

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

取出upstream awk_test对应的配置块:

Solution1:

AAffA0nNPuCLAAAAAElFTkSuQmCC

Solution2:

AAffA0nNPuCLAAAAAElFTkSuQmCC

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

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

AAffA0nNPuCLAAAAAElFTkSuQmCC

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

AAffA0nNPuCLAAAAAElFTkSuQmCC

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

AAffA0nNPuCLAAAAAElFTkSuQmCC

AAffA0nNPuCLAAAAAElFTkSuQmCC

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

AAffA0nNPuCLAAAAAElFTkSuQmCC

结语

综上所述:

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

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

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

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

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

作者:点融黑帮

链接:https://www.jianshu.com/p/f588369b2c0b

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值