我正在尝试 grep ngrep 的输出。不幸的是,当我将另一个 grep 添加到管道时,我根本没有得到任何输出。它也可能是其他命令 - cat / grep / tee - 一切都会破坏链条。示例:
# this works:
$ ngrep -l -q -T -Wbyline -d any udp and port 5060 |
egrep -B1 '^SIP/2.0 180'
--
U +1.469535 xxx:5060 -> xxx:5060
SIP/2.0 180 Ringing.
--
U +0.001384 xxx:5060 -> xxx:2048
SIP/2.0 180 Ringing.
但
#these don't:
$ ngrep -l -q -T -Wbyline -d any udp and port 5060 |
egrep -B1 '^SIP/2.0 180' | egrep '^U'
$ ngrep -l -q -T -Wbyline -d any udp and port 5060 |
egrep -B1 '^SIP/2.0 180' | cat
$ ngrep -l -q -T -Wbyline -d any udp and port 5060 |
egrep -B1 '^SIP/2.0 180' | tee test
cat somefile
如果一开始就使用ngrep 而不是 ngrep,一切都会按预期进行。有什么想法可能出什么问题吗?
答案1
您是否已将 egrep 别名为任何可能修改文本的东西,比如grep --color
可能会做什么?$ type egrep
od -bc
还要使用(如 jch 所述)或检查输出中是否存在“隐藏”控制字符hd -C
。
答案2
编辑:我刚刚用‘egrep’遇到了这个问题——正在做:
tail -f somefile|egrep 'somepattern'
每两秒钟就能提供令人满意的输出;但接下来产生的没有什么:
tail -f somefile|egrep 'somepattern'|tr -d '%'
在手册页中挖掘一番后,我发现“--line-buffered”选项再次产生了输出!
然后我发现了这个管道缓冲描述- 看起来,归根结底是一些命令行实用程序(例如:tail -f)会在 stdout 上定期调用 fflush,而其他命令行实用程序(cut、grep 等)则不会。
以下是我错误的第一个回复
通常当我遇到这些类型的问题时,管道中的一个或多个程序会将输出放在多个文件描述符上 - 通常是 STDERR。
您可以尝试在管道中的第一个“|”前添加“2>&1”以将 STDERR 重定向到 STDOUT。