我遇到了sed的问题,我无法弄明白,而且我也是业余爱好者。
我的代码的目标是继续监视文件(OutputFile.dat),直到找到可能的字符串(NaN或STOP),然后终止在后台运行的程序。当我只试过一根弦时,它才奏效。但是,当我尝试实施更多可能的匹配时,代码无法解决问题。
../program inputfile &> OutputFile.dat &
tail -f OutputFile.dat | sed -n '/NaN/q;/STOP/q'
killall program
我尝试过很多不同的事情,但我无法解决这个问题。我们也欢迎提供相同建议的替代建议。
提前致谢
答案 0 :(得分:4)
由于缓冲和竞争条件,这很棘手。您当前的代码问题是:
OutputFile.dat是在后台异步创建的,当tail
尝试查找时可能不存在。
您可以通过同步打开文件来解决此问题
program
可能会将输出缓冲到更大的块中,因为它并不认为您关心时序。
您可以尝试通过要求program
不要缓冲,或者在GNU / Linux上使用stdbuf
来解决此问题。
在sed
识别匹配后,tail将需要检测并写入另一个缓冲区数据,然后才能实现,退出并让脚本继续运行。
您可以通过将脚本结构化以等待sed
而不是tail
来解决此问题。
由于您说您的脚本适用于一个关键字,如果您的第二个关键字出现在结尾或输出暂停,那么您的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