0

我有一个脚本需要相当长的时间才能执行。在整个过程中,它不断输出到标准输出。我希望使用诸如 kdialog 或 zenity 之类的图形实用程序在某种进度对话框中以交互方式显示其中一些消息,但这在这里无关紧要,因为我寻求的解决方案不应该依赖于它。

为了做到这一点,我正在尝试以下

<call to actual job> | egrep <regex> | xargs -I{} <call to display utility> {}

问题是,一旦我插入对egrep输出的调用,就会累积到主要工作完成,然后才有效地通过管道传输到xargs. 如果我egrep取出,那么它会按预期工作,并且状态消息会以交互方式传送到xargs,但随后会显示很多不相关的信息。

我一直在互联网上搜索并阅读手册grep无济于事,有谁知道我怎样才能实现所需的行为?

实际例子

我相信以下示例的行为类似于我的真实案例。

(sleep 1; echo A; sleep 1; echo 0; sleep 1; echo B) | egrep -i [a-z] | xargs -I{} echo {}
4

2 回答 2

2

尝试使用缓冲较少的命令。我不确定 awk 但你可以这样做:

<call to actual job> | awk '/regex/' | xargs -I{} <call to display utility> {}

另一个使用 sed:

<call to actual job> | sed -n '/regex/p' | xargs -I{} <call to display utility> {}

我最喜欢的实际上是 bash:

function filter {
    while read -r __; do
        [[ $__ =~ $1 ]] && echo "$__"
    done
}

<call to actual job> | filter "<regex>" | xargs -I{} <call to display utility> {}

它可能会慢一点,但它肯定不会缓冲输出太多。

于 2013-09-14T21:59:28.227 回答
0

同时,我找到了这个问题的确切答案:grep它的变体可以选择逐行强制冲洗。

男人不是很有帮助

--line-buffered 在输出上使用行缓冲。这可能会导致性能损失。

这就是为什么我一开始忽略了这个选项。

幸运的是grep --help,它更明显。

--line-buffered每行刷新输出

于 2013-09-14T23:52:40.437 回答