我如何在连续的角色流中抓取或sed



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

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

我想尽快退出此程序。在输出中看到,我尝试了:

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

但是,在Perl程序退出之前,Grep似乎没有看到" A"。

我也尝试过没有运气的SED;

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

有什么想法我如何解决?

此处的问题是grepsed都对其输入进行列表,除非另有说明。一个解决方法是插入新线,例如使用COREUTILS fold

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

,这仍然是由于缓冲而存在问题。您可以使用CORUTILS stdbuf禁用此内容:

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

另一种选择是使用dd,例如:

perl -E '$|=1;print "OUTn";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

最新更新