管道到awk挂起

时间:2011-08-06 03:18:55

标签: awk packet-capture piping tshark

我正在尝试将tshark输出传递给awk。 tshark命令可以自行工作,当通过管道传输到cat等其他程序时,它可以正常工作(实时打印输出)。然而,当用管道传输到awk时,它会挂起而没有任何反应。

sudo tshark -i eth0 -l -f "tcp" -R 'http.request.method=="GET"' -T fields -e ip.src -e ip.dst -e 
tcp.srcport -e tcp.dstport -e tcp.seq -e tcp.ack | awk '{printf("mz -A %s -B %s -tcp \"s=%s sp=%s 
dp=%s\"\n", $2, $1, $5, $4, $3)}'

这是一个更简单的版本:

sudo tshark -i eth0 -f "tcp" -R 'http.request.method=="GET"' | awk '{print $0}'

为了比较,以下工作正常(虽然不是很有用):

sudo tshark -i eth0 -f "tcp" -R 'http.request.method=="GET"' | cat

提前致谢。

2 个答案:

答案 0 :(得分:4)

我遇到了同样的问题。

我发现了一些不完全可移植的部分“解决方案”。 其中一些指向使用fflush()或flush()awk函数或-W交互式选项

http://mywiki.wooledge.org/BashFAQ/009

我试过了两个都没有用。所以awk根本不是合适的命令。

他们中的一些人建议使用gawk,但这对我来说都不是。

cut 命令有同样的问题。

我的解决方案:在我的情况下,我只需要在GREP中放置-line-buffered而不是触及awk命令,但在你的情况下我会尝试:

sed -u 

使用正确的正则表达式。例如:

sed -u 's_\(.*\)     \(.*\)  \(.*\) DIFF: \(.*\)_\3 \4_'

此表达式为您提供由TAB分隔的第3和第4列(使用ctrl + v和TAB组合编写)。使用-u选项可以获得无缓冲的输出,并且还有-l选项可以为您提供行缓冲输出。

我希望你觉得这个答案有用虽然已经很晚了

答案 1 :(得分:2)

根据评论中我们之前的消息,也许它会强制关闭输入并发出换行符。

sudo tshark -i eth0 -f "tcp" -R 'http.request.method=="GET"' ...... \
| {
    awk '{print $0}'
    printf "\n"
  }

注意,awk和printf之间没有管道。

我希望这会有所帮助。