1

我正在尝试将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

提前致谢。

4

3 回答 3

4

我有同样的问题。

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

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

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

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

cut命令也有同样的问题。

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

sed -u 

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

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

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

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

于 2013-03-21T21:32:48.187 回答
2

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

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

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

我希望这有帮助。

于 2011-08-08T02:53:47.120 回答
1

我在这里找到了解决方案 https://superuser.com/questions/742238/piping-tail-f-into-awk(作者 John1024)。

它说:

“你不会实时看到它,因为为了提高效率,管道是缓冲的。tail -f 必须在输出传递给 awk 之前填满缓冲区,通常是 4 kB。”

建议的解决方案是使用“unbuffer”或“stdbuf -o0”命令来禁用缓冲。它对我有用:

stdbuf -o0 tshark -i ens192 -f "ip" | awk '{打印 $0}'

于 2021-12-11T08:29:03.723 回答