何时使用 grep、less、awk、sed

何时使用 grep、less、awk、sed

我正在进入 Linux 的世界,并且在工作中我使用的grep越来越多。通过这样做,我发现有时它不足以满足我的要求。

grep几天前,我正在苦苦挣扎,我的一位高级 Linux 管理员同事告诉我使用awk.我对得到结果的速度感到惊讶。

所以我的问题是你什么时候选择使用其中一种而不是另一种?在开始工作grep并花费大量时间之前我可以问自己哪些问题,而我本可以这样做awk并节省时间?

答案1

sedawk是 的超集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返回匹配的部分(几行awksed做同样的事情)
  • (非标准)grep -A/B/C返回匹配的上下文(再次以类似的方式使用sedor很痛苦awk

sed

  • s/foo/bar/:seds命令具有难以实现的功能,awk例如:
  • s/foo\(.*\)bar/\1/g:捕获(尽管 GNU awk 有一个gensub()扩展)
  • s/foo/bar/3:替换每行第三个出现的地方
  • (非标准):就地文件编辑(尽管 GNUawk现在也支持它)。

awk

awk是三者中功能最丰富的。

  • 适合处理数字
  • 适合处理列格式的输入。
  • 适合使用关联数组提取和组合来自不同来源的数据。

珀尔

perl作为一个实用的提取和报告工具,它具有所有这些工具中最好的。这就是它最初设计的目的(成为使所有这些sed/过时的工具awk)。

掌握perl文本处理确实具有很大的优势。我建议花一些时间在上面,甚至在查看不太常见的sed命令之前。

表现

根据经验,工具越专业,完成任务的效率就越高。但这在很大程度上取决于实施、任务和其他一些因素,并且性能可能需要进行权衡。

例如,有一些grep实现sed速度非常快,但例如它们不支持多字节字符,因此只能在多字节语言环境中的美国英语文本上正常工作。或者它们速度很快,因为它们在一个小的固定长度缓冲区上工作,因此不能在任意输入上工作......

相关内容