【问题标题】:grep from output and do something on first occurence从输出中 grep 并在第一次出现时执行某些操作
【发布时间】:2014-10-21 12:24:24
【问题描述】:

我的服务器上有一个特定工具的日志流,具有持久输出。 我说是这样的

task 3 done
all is ok
added another task
something made

由于某种原因,我无法从输出文件中进行 grep,但我有机会通过管道或输出流进行操作:

./myexecutablefile | grep something

在这种情况下,如果它出现在输出中,我会收到突出显示的“某物”。

如果遇到第一次,我想做点什么,但我不知道怎么做,因为连续流。例如,如果我看到一些错误,我的目标是终止进程。

这肯定不行,&& kill 会在可执行文件结束后开始

./myexecutable | grep 'Error occured' && kill -9 myexecutable

【问题讨论】:

  • 您希望此过程继续吗?或者只是监控一个流,然后当你 grep 你想要的东西时,做点什么就可以了?
  • 不要使用kill -9,除非您知道该程序有错误并且不会响应常规信号(在这种情况下,可能不信任它足以运行首先)。

标签: linux bash process


【解决方案1】:

您需要在grep 中使用-q 选项:

./myexecutable | grep -q 'Error occured' && kill -9 myexecutable

【讨论】:

  • --line-buffered 有什么作用,为什么在这里有用?
  • 强制输出为行缓冲。
  • 我不是 100% 确定这里是否需要这样做。回到我的电脑后会测试它。
  • 我以为-q,没有输出到缓冲?
  • 嗯我相信你是对的,这里可能不需要--line-buffered(现在编辑)
【解决方案2】:

如果您只对第一次出现感兴趣,可以使用 grep 的 -m 开关:

./myexecutablefile | grep -m1 something && do_something

这仍然会输出匹配的行。要抑制这种情况,您可以打开-q,但随后您就不再需要-m1了:

./myexecutablefile | grep -q something && do_something

【讨论】:

  • 谢谢!难道你不知道,有没有办法在终端显示完整的输出,但仍然通过 grep 等待第一次出现?
  • @StasErem:你可以试试| tee >(grep -q something && do-something)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多