【问题标题】:Can't get this simple sed command无法获得这个简单的 sed 命令
【发布时间】:2016-03-14 23:06:03
【问题描述】:

我在使用 sed 时遇到问题,无法弄清楚,而且我也是业余爱好者。

我的代码的目标是继续监视文件(OutputFile.dat),直到找到可能的字符串(NaN 或 STOP),然后终止在后台运行的程序。当我只尝试一个字符串时它就起作用了。但是,当我尝试实现更多可能的匹配时,代码并没有成功。

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

我尝试了很多不同的东西,但我无法弄清楚这一点。也欢迎实现相同目标的替代建议。

提前致谢

【问题讨论】:

  • ` egrep 'NaN|STOP' ` 会找到字符串,不确定第二步,也许寻找非零返回码,然后杀死???

标签: linux shell sed pipe


【解决方案1】:

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

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

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

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

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

  3. sed 识别出匹配后,tail 需要检测并写入另一个充满数据的缓冲区,然后才能意识到这一点,退出并让脚本继续运行。

    您可以通过将脚本构造为等待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

【讨论】:

  • 那个人,谢谢你的回答,实际上解决了这个问题。但是我认为我可能在缓冲方面遇到问题。我正在将 matlab 代码(优化过程)链接到 linux 程序中,我需要继续阅读输出以检查可能的错误。当我仅在提示符下运行您的建议时,它可以工作,但是,当我通过 matlab 运行几次时,我会卡在终端上。发生这种情况时,我检查其中一个输出文件,并且程序已经完成。看来 sh 无法完成。您知道原因或任何解决方案吗?
  • 如果您并行运行多次,所有实例都将竞争名称“OutputFile.dat”。确保每个实例写入不同的文件名。
  • 我没有并行运行,以避免出现写同一个文件的问题。我无法更改程序的输出(程序编写的那个),因此我无法并行运行。
猜你喜欢
  • 2010-10-29
  • 2020-12-03
  • 1970-01-01
  • 1970-01-01
  • 2014-06-15
  • 1970-01-01
  • 1970-01-01
  • 2013-04-29
相关资源
最近更新 更多