【问题标题】:Only display the found output a grep of multiple files仅显示找到的输出多个文件的 grep
【发布时间】:2020-05-02 15:50:55
【问题描述】:

我正在使用 grep 在文件中查找字符串。 grep 可能只会找到一个与文件名匹配的文件,可能是两个,但我只需要它在找到它的情况下放入字符串,并且只需要字符串。

grep -oh 'Closing finished' /opt/cpu/hold/closing15{14..23} 

目前我得到如下输出:

grep: /opt/cpu/hold/closing1514: No such file or directory
Closing finished
Closing finished
grep: /opt/cpu/hold/closing1517: No such file or directory
grep: /opt/cpu/hold/closing1518: No such file or directory

我在 bash 脚本的一个函数中使用它,在一个直到循环中匹配“关闭完成”,然后再继续。因此,如果找到输出,我希望输出只是“关闭完成”,因此它与我的直到条件相匹配。

【问题讨论】:

  • 您可以尝试添加 -q 标签
  • @pandygiankoulidis 将抑制标准输出,而不是错误输出。为了抑制错误,应该使用-s 选项或者只是将错误输出重定向到 dev null

标签: linux bash awk grep xargs


【解决方案1】:

如果您想要抑制有关不存在文件的错误,只需使用-s 选项:

-s, --no-messages
       Suppress error messages about nonexistent or unreadable files.

即您的示例命令应如下所示:

grep -soh 'Closing finished' /opt/cpu/hold/closing15{14..23} 

或者,您也可以通过将错误输出重定向到 /dev/null 来完全抑制错误输出,如下所示:

grep -oh 'Closing finished' /opt/cpu/hold/closing15{14..23} 2>/dev/null

【讨论】:

  • 就是这样,非常感谢!如果它确实在 2 个文件中找到 2 个字符串,有没有办法抑制该输出,所以它只输出一次字符串?
  • 回答了我自己的问题。我将在第 1 行添加一行 awk。
  • grep 有一个选项 -m N 在第 N 次匹配后停止搜索,但它适用于读取单个文件的上下文。例如-m 1 会在给定文件中找到第一个匹配项后停止。但是,当您在多个文件之间进行匹配时,它仍会继续在其余文件中搜索(并再次仅打印每个文件中的第一个匹配项)。您可以简单地在 grep 之后附加 | head -n 1 以打印所有文件中的第一个匹配项顺便说一句这已经有答案 here ;)
  • @T_wrong 如果您使用 awk,则不需要 grep,因此如果单独使用 grep 不足以解决您的问题,则单独使用 awk,而不是两者都使用。在这种情况下,您可以将 grep 输出通过管道传输到 sort u,从而最多只能获得 1 个“Closing finished”。如果您需要更多帮助,请提出新问题。
猜你喜欢
  • 2017-12-14
  • 2011-04-23
  • 2021-12-22
  • 1970-01-01
  • 1970-01-01
  • 2018-06-26
  • 1970-01-01
  • 2017-03-15
  • 2019-07-31
相关资源
最近更新 更多