监控并有条件地继续输出命令


1

在bash中,我有一个在屏幕上运行的命令有效:

while true
do
  echo $RANDOM
  sleep 1
done

其输出是:

12396
19683
31641
...

我想把它管道化为像grep / awk这样的东西,我匹配一个特定的模式,比如12345,我想要一个命令来运行。

我不想捕获正在运行的命令的完整输出 - 它可能会在找到匹配项之前运行很长时间并且我不想在机器上浪费空间。

这可以在bash中轻松完成吗?

在一个理想的世界里,我还希望输出继续打印到终端,这样我就可以自己远程监控输出,但这并不是绝对必要的。

Answers:


1
./feeding_script.sh |
tee >(while read a; do [ "$a" == "12345" ] && </dev/null another_command; done)

笔记:

  • tee拆分数据流; 一个副本转到“文件”,在这种情况下是一个命令>(…),另一个继续到终端;
  • </dev/null another_command- 此重定向可防止another_command消耗由此生成的数据feeding_script.sh

为什么</dev/null需要它,它将与tee共享相同的stdin?看起来像while和test会首先获得输入,但我不太确定过程替换会发生什么(或者如果another_command需要很长时间并且feeding_script数据备份会发生什么)
Xen2050'Dec'30'30

@ Xen2050如果another_command可以从stdin(没有重定向)自给自足,那么它将能够消耗触发后的任意数量的行12345。这些线永远不会去while read …。我以为他们都应该去那里接受测试。但是,如果这个想法是检测12345作为先于数据的标题应该去another_command,则</dev/null是错误的。
Kamil Maciorowski
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.