【问题标题】:piping to awk hangs到 awk 的管道挂起
【发布时间】:2011-10-21 07:51:46
【问题描述】:

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

提前致谢。

【问题讨论】:

  • 请问什么操作系统/版本的 Linux。此外,如果您的系统有unbuffer,请尝试将其添加到组合中。不是一个很好的解决方案,但如果你需要它工作,那可能会做到。祝你好运。
  • 使用 Ubuntu 11.04。我尝试了 unbuffer,但没有运气 - 它只是挂起。
  • 您的问题有据可查。但是......是否可以安全地假设您使用cat 的最后一个示例在使用tshark 的所有选项(即-T fields ...)时也有效?看来awk 处理输出应该没有问题。另外,当你把sudo 从图片中取出时会发生什么?祝你好运。
  • cat 适用于所有选项。我刚刚意识到 awk '最终'工作 - 几秒钟后。所以我认为 awk 正在缓冲或其他什么。由于问题的性质,快速响应非常重要,所以我需要想办法停止 awk 缓冲。

标签: awk packet-capture piping tshark


【解决方案1】:

我遇到了同样的问题。

我发现了一些不完全可移植的部分“解决方案”。 其中一些指向使用 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 选项提供行缓冲输出。

我希望这个答案对你有用,虽然很晚

【讨论】:

    【解决方案2】:

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

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

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

    我希望这会有所帮助。

    【讨论】:

    • 这大大增加了响应时间。然而,它仍然不是即时的,这很奇怪。我会尝试使用 awk 以外的东西。谢谢你的帮助。
    • 您可能不需要 printf,但保留 { ... } 包装器。祝你好运。
    【解决方案3】:

    我在这里找到了解决方案 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 '{print $0}'

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-14
      • 1970-01-01
      • 2018-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-08
      相关资源
      最近更新 更多