我有一个需要相当长时间才能执行的脚本。在整个过程中,它不断输出到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 {}
答案 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
使其更加明显。
每次- 行缓冲刷新输出