Linux 如何在连续的字符流中进行grep或sed? 我有一个程序,输出一些文本,然后是连续的字符流:

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 "

我想在输出中看到“A”后立即退出此程序,并尝试:

grep -m 1 A <(perl -E '$|=1;print "OUT\n";print "A" and sleep 1 for 1..10')

grep-m1a这里的问题是
grep
sed
都按行处理输入,除非另有说明。一种解决方法是插入换行符,例如使用coreutils
fold

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