bash,链接 grep 命令,在数据到来时进行处理
bash, chaining grep commands, processing as the data come
当我使用单个 grep 命令时,它会实时处理和输出数据。
这是我的简单测试文件test.sh
:
echo a
sleep 1
echo b
sleep 1
echo ab
sleep 1
echo ba
sleep 1
echo baba
我执行以下操作:
sh test.sh | grep a
a
ab
ba
ab
ba
一切都很好。 'a' 立即出现,然后 'ab',等等
但是当我像这样通过管道传输多个 grep 命令时
sh ./test.sh | grep a | grep b
ab
ba
baba
我只得到最后的输出,而不是原样!
终端保持空白,直到处理完整个文件,然后一次性输出所有内容。
这是为什么?
我如何 chain/cascade 多个 grep 而不会丢失 'process and output as it comes' 属性?
这是为了 greping 和处理包含大量数据的实时巨大日志,我只能将过滤后的版本保存到磁盘,而不是会很快填满磁盘的巨大原始输出。
有一个名为 line-buffered
的选项:
Other Options
--line-buffered
Use line buffering on output. This can cause a performance penalty.
所以:
sh ./test.sh | grep --line-buffered a | grep b
当我使用单个 grep 命令时,它会实时处理和输出数据。
这是我的简单测试文件test.sh
:
echo a
sleep 1
echo b
sleep 1
echo ab
sleep 1
echo ba
sleep 1
echo baba
我执行以下操作:
sh test.sh | grep a
a
ab
ba
ab
ba
一切都很好。 'a' 立即出现,然后 'ab',等等
但是当我像这样通过管道传输多个 grep 命令时
sh ./test.sh | grep a | grep b
ab
ba
baba
我只得到最后的输出,而不是原样! 终端保持空白,直到处理完整个文件,然后一次性输出所有内容。
这是为什么?
我如何 chain/cascade 多个 grep 而不会丢失 'process and output as it comes' 属性?
这是为了 greping 和处理包含大量数据的实时巨大日志,我只能将过滤后的版本保存到磁盘,而不是会很快填满磁盘的巨大原始输出。
有一个名为 line-buffered
的选项:
Other Options
--line-buffered
Use line buffering on output. This can cause a performance penalty.
所以:
sh ./test.sh | grep --line-buffered a | grep b