linux - 如何在连续的字符流中进行 grep 或 sed?

标签 linux shell sed grep buffer

我有一个程序输出一些文本然后是连续的字符流:

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

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

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

但是,在 perl 程序退出之前,grep 似乎看不到“A”。

我也尝试过使用 sed 但没有成功;

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

有什么办法可以解决这个问题吗?

最佳答案

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

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

但是由于管道缓冲,这仍然存在问题。您可以使用 coreutils stdbuf 禁用它:

grep -m 1 A \
  <(perl -E '$|=1;print "OUT\n";print "A" and sleep 1 for 1..10' |
    stdbuf -o0 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

关于linux - 如何在连续的字符流中进行 grep 或 sed?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43659543/

相关文章:

linux - 为什么 bash 历史扩展在函数中不起作用?

php - Ubuntu 16.10 x64 上的 Laravel 5.3 的 Cron 作业

linux - 从 shell 变量中解析数据并使用新数据重用变量

bash - 为什么在 Bash 中我的条件会出现 "unexpected operator"错误?

c++ - 更新后库的 OpenCV 链接器错误

bash - 首先使用 sed 替换文件中的字符串

php - 为什么我在使用 Zend Framework 1 发送电子邮件时收到 500 内部服务器错误?

shell - 打印两个图案之间的线条,如果找到某些文本则忽略这些线条

linux - 在多个文件中的现有字符串周围添加引号

linux - 有没有办法在 sed 中获取字符的 ASCII 码?