我正在尝试将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
提前致谢。
答案 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之间没有管道。
我希望这会有所帮助。