Linux 如何在连续的字符流中进行grep或sed? 我有一个程序,输出一些文本,然后是连续的字符流:
我想在输出中看到“A”后立即退出此程序,并尝试:Linux 如何在连续的字符流中进行grep或sed? 我有一个程序,输出一些文本,然后是连续的字符流:,linux,shell,sed,grep,buffer,Linux,Shell,Sed,Grep,Buffer,我想在输出中看到“A”后立即退出此程序,并尝试: grep -m 1 A <(perl -E '$|=1;print "OUT\n";print "A" and sleep 1 for 1..10') grep-m1a这里的问题是grep和sed都按行处理输入,除非另有说明。一种解决方法是插入换行符,例如使用coreutilsfold: grep -m 1 A \ <(perl -E '$|=1;print "OUT\n";print "
grep -m 1 A <(perl -E '$|=1;print "OUT\n";print "A" and sleep 1 for 1..10')
grep-m1a这里的问题是grep
和sed
都按行处理输入,除非另有说明。一种解决方法是插入换行符,例如使用coreutilsfold
:
grep -m 1 A \
<(perl -E '$|=1;print "OUT\n";print "A" and sleep 1 for 1..10' | fold -w1)
另一种选择是使用dd
,例如:
perl -E '$|=1;print "OUT\n";print "A" and sleep 1 for 1..10' |
while :; do
c=$(dd bs=1 count=1 status=none)
if [[ "$c" == "A" ]]; then
break
else
: Do something else
fi
done
不,当输入不是来自终端时,grep(1)
和sed(1)
使用大缓冲区读取,因此您不能假设读取整行数据,而是大块数据,这会使问题变得更糟。@LuisColardo:当它们位于管道末端时,它们使用行缓冲。比较,例如:seq 3 |读取时;不要回答;睡眠1;读取时完成| grep.
至序列3 |;不要回答;睡眠1;完成| grep.|cat
no,它们逐行处理输入,但它们读取文件系统信息指定的块(每次一个完整的磁盘块)。相信我,或者看看节目来源。我们的目标是提高效率,逐行读取不会带来任何改进(在管道中,这确实是不可能的,因为没有字符处理——就像在设备驱动程序中一样——在内核中获得每一行标记的输入,所以不可能有行缓冲)@LuisColorado:我明白你的意思。我的解释是基于它在用户眼中的表现,而不涉及太多细节。我根据你的意见做了一些调整。
grep -m 1 A \
<(perl -E '$|=1;print "OUT\n";print "A" and sleep 1 for 1..10' | fold -w1)
grep -m 1 A \
<(perl -E '$|=1;print "OUT\n";print "A" and sleep 1 for 1..10' |
stdbuf -o0 fold -w1)
perl -E '$|=1;print "OUT\n";print "A" and sleep 1 for 1..10' |
while :; do
c=$(dd bs=1 count=1 status=none)
if [[ "$c" == "A" ]]; then
break
else
: Do something else
fi
done