2016-03-14 27 views
3

我遇到了sed问题,我无法弄清楚,而且我也是业余爱好者。不能得到这个简单的sed命令

我的代码的目标是保持监视文件(OutputFile.dat),直到找到可能的字符串(NaN或STOP),然后杀死在后台运行的程序。它工作时,我只尝试过一个字符串。但是当我试图实现更多可能的匹配时,代码无法工作。

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

我试过很多不同的东西,但我无法弄清楚这一点。替代性的建议来实现同样的事情也是受欢迎的。

在此先感谢

+0

'的egrep“的NaN | STOP”'会发现弦,不知道第二步,或许寻找非零返回代码,然后杀了??? –

回答

4

这是棘手的,由于缓冲和竞争条件。目前存在的问题与您的代码是:

  1. OutputFile.dat是在后台异步创建,并不在那里当tail试图寻找它。

    您可以通过打开文件同步

  2. program可以缓冲输出到出于效率的考虑更大的块解决这个问题,因为它不觉得你在乎时间。

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

  3. sed识别出匹配后,尾部将需要检测并写入另一个缓冲区已满的数据,然后才意识到退出并让脚本继续。

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

既然你说你的脚本适用于一个关键词,你的搅局者可能#3,如果你的第二个关键字出现接近年底或输出暂停。

总之,这将是:

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

那个家伙,谢谢你的回答,那实际上解决了这个问题。不过,我想我可能会遇到缓冲问题。我正在将一个matlab代码(优化过程)链接到一个linux程序,我需要继续阅读输出以检查可能的错误。当我只在提示符下运行你的消化时,它可以工作,但是,当我通过matlab运行几次时,我卡在终端上。发生这种情况时,我检查其中一个输出文件,并且程序已经完成。看来sh不能完成。你有什么想法,或者任何解决方案吗? –

+0

如果多次并行运行,所有实例都将争用名称“OutputFile.dat”。确保每个实例写入不同的文件名。 –

+0

我没有并行运行,以避免写入相同文件的问题。我无法更改程序的输出(程序写入的那个),因此我无法并行运行。 –

相关问题