我正在进入 Linux 的世界,并且在工作中我使用的grep
越来越多。通过这样做,我发现有时它不足以满足我的要求。
grep
几天前,我正在苦苦挣扎,我的一位高级 Linux 管理员同事告诉我使用awk
.我对得到结果的速度感到惊讶。
所以我的问题是你什么时候选择使用其中一种而不是另一种?在开始工作grep
并花费大量时间之前我可以问自己哪些问题,而我本可以这样做awk
并节省时间?
答案1
sed
和awk
是 的超集grep
,有些事情用其中一个或另一个更容易做。
grep foo
可以写成sed '/foo/!d'
或awk /foo/
,但请考虑:
grep -i foo
除非sed '/[fF][oO][oO]/!d'
你想考虑像 GNU 的sed '/foo/I!d'
.或者使用awk
:awk 'tolower($0) ~ /foo/'
或再次使用 GNU 扩展: awk -v IGNORECASE=1 /foo/
。
不同工具擅长的事情以及其他工具的麻烦事:
grep
grep
是一个简单的工具,但具有非常专门的操作模式,很难用awk
或重现sed
:
grep -i
用于不区分大小写的匹配(见上文)grep -Fe "$string"
用于固定字符串搜索(export string; awk 'index($0, ENVIRON["string"])'
与awk
,没有直接等效的与sed
)。- (非标准)
grep -r
用于递归搜索 - (非标准)
grep -P
/pcregrep
用于类似 perl 的正则表达式(某些sed
实现具有类似 perl 的正则表达式支持,尽管不是最主要的) - (非标准)
grep -o
返回匹配的部分(几行awk
或sed
做同样的事情) - (非标准)
grep -A/B/C
返回匹配的上下文(再次以类似的方式使用sed
or很痛苦awk
)
sed
s/foo/bar/
:sed
的s
命令具有难以实现的功能,awk
例如:s/foo\(.*\)bar/\1/g
:捕获(尽管 GNU awk 有一个gensub()
扩展)s/foo/bar/3
:替换每行第三个出现的地方- (非标准):就地文件编辑(尽管 GNU
awk
现在也支持它)。
awk
awk
是三者中功能最丰富的。
- 适合处理数字
- 适合处理列格式的输入。
- 适合使用关联数组提取和组合来自不同来源的数据。
珀尔
perl
作为一个实用的提取和报告工具,它具有所有这些工具中最好的。这就是它最初设计的目的(成为使所有这些sed
/过时的工具awk
)。
掌握perl
文本处理确实具有很大的优势。我建议花一些时间在上面,甚至在查看不太常见的sed
命令之前。
表现
根据经验,工具越专业,完成任务的效率就越高。但这在很大程度上取决于实施、任务和其他一些因素,并且性能可能需要进行权衡。
例如,有一些grep
实现sed
速度非常快,但例如它们不支持多字节字符,因此只能在多字节语言环境中的美国英语文本上正常工作。或者它们速度很快,因为它们在一个小的固定长度缓冲区上工作,因此不能在任意输入上工作......