无法获得这个简单的sed命令

时间:2016-03-14 23:06:04

标签: linux shell sed pipe

我遇到了sed的问题,我无法弄明白,而且我也是业余爱好者。

我的代码的目标是继续监视文件(OutputFile.dat),直到找到可能的字符串(NaN或STOP),然后终止在后台运行的程序。当我只试过一根弦时,它才奏效。但是,当我尝试实施更多可能的匹配时,代码无法解决问题。

    ../program inputfile &> OutputFile.dat &
    tail -f OutputFile.dat | sed -n '/NaN/q;/STOP/q'
    killall program

我尝试过很多不同的事情,但我无法解决这个问题。我们也欢迎提供相同建议的替代建议。

提前致谢

1 个答案:

答案 0 :(得分:4)

由于缓冲和竞争条件,这很棘手。您当前的代码问题是:

  1. OutputFile.dat是在后台异步创建的,当tail尝试查找时可能不存在。

    您可以通过同步打开文件来解决此问题

  2. 出于效率原因,
  3. program可能会将输出缓冲到更大的块中,因为它并不认为您关心时序。

    您可以尝试通过要求program不要缓冲,或者在GNU / Linux上使用stdbuf来解决此问题。

  4. sed识别匹配后,tail将需要检测并写入另一个缓冲区数据,然后才能实现,退出并让脚本继续运行。

    您可以通过将脚本结构化以等待sed而不是tail来解决此问题。

  5. 由于您说您的脚本适用于一个关键字,如果您的第二个关键字出现在结尾或输出暂停,那么您的showstopper很可能是#3。

    总之,这将是:

    #!/bin/bash
    ( stdbuf -o 0 -e 0 ../program inputfile & ) &> OutputFile.dat
    sed -n '/NaN/q;/STOP/q' <(tail -f OutputFile.dat)
    killall program