何时使用grep,更少,awk,sed [关闭]


17

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

grep几天前,我在苦苦挣扎,我的一位资深Linux管理员同事告诉我使用awk。我以如此快的速度震惊了我。

所以我的问题是,您什么时候选择一个使用另一个?grep如果可以awk节省时间,在上班并花费大量时间之前,我可以问自己什么问题?


这是一个很好的问题,但它确实非常广泛,并且主要基于意见。要回答您的问题,使用grep而不是awk实际上取决于您使用awk / sed的舒适程度。人们之所以会在后者上使用它有几个原因,例如,寻找比grep所提供的东西更具体的东西,或者您是否尝试用特定的字符串替换/编辑文件(使用sed)。但是同样,一切都取决于您的舒适度和使用awk / sed的经验。
ryekayo

7
使用less查看文件。使用grep搜索通过文件。使用sed编辑的文件。使用awkgrep并且sed当你要处理的文件有某种结构(如列)。当您主要想处理行(例如删除或添加文本行)时,请使用sedover awk。我敢肯定有人会写一个20页的答案,比我的答案更完整。
聪桂

嗨,佐藤,这不是关于长度,而是说什么。您的几行内容非常有用。谢谢。
frankguthrie

Answers:


25

sed并且awk是的超集grep,有些事情更容易与另一者进行。

grep foo可以写为sed '/foo/!d'awk /foo/,但请考虑:

grep -i foosed '/[fF][oO][oO]/!d'除非您想考虑非标准扩展(例如GNU的扩展),否则将必须是sed '/foo/I!d'。或使用awkawk '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用于类似sedperl的正则表达式(某些实现具有perl式正则表达式支持,尽管不是最主要的)
  • (非标准)grep -o以返回匹配的部分(相同的几行awksed相同的行)
  • (非标准)grep -A/B/C以返回比赛前后的上下文(再次痛苦地以sed或相似的方式进行awk

sed

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

awk

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

  • 非常适合处理数字
  • 非常适合处理以列格式设置的输入。
  • 适用于从不同来源提取和合并关联数组的数据。

佩尔

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

精通perl文本处理确实带来了很大的优势。我建议花一些时间,甚至在查看一些不太常见的sed命令之前。

性能

根据经验,该工具越专业,就越有效。但这也很大程度上取决于实现,任务以及其他一些因素,而性能可能需要权衡取舍。

例如,有些grepsed实施非常快,但是例如,它们不支持多字节字符,因此只能在多字节语言环境中的美式英语文本上正常工作。或者它们之所以快,是因为它们在较小的固定长度缓冲区上工作,因此无法在任意输入上工作...


很好的答案!您知道工具的效率吗?我对OP的声明感到困惑,那awk比快得多grep
pfnuesel

@pfnuesel,这在很大程度上取决于实现和使用模式。例如,mawk被称为是非常有效的(但不支持多字节字符,这是它比其他一些工具更有效的部分原因)
斯特凡Chazelas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.