通过grep交互式管道

时间:2013-09-14 21:52:24

标签: bash grep pipe

我有一个需要相当长时间才能执行的脚本。在整个过程中,它不断输出到stdout。我希望使用像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 {}

2 个答案:

答案 0 :(得分:2)

尝试使用less buffered命令。我不确定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> {}

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

答案 1 :(得分:0)

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

男人不是很有帮助

  

<强> - 行缓冲          在输出上使用行缓冲。这可能会导致性能下降。

这就是我开始忽略这个选项的原因。

幸运的是grep --help使其更加明显。

  每次

- 行缓冲刷新输出