如何捕获 UDP 流量以便将其传输到 grep

如何捕获 UDP 流量以便将其传输到 grep

我正在尝试捕获作为 StatsD 指标发送的 UDP 流量(在端口 8125 上)。

我尝试过的最简单的方法是运行nc -ul 8125,将指标打印到终端……但它们不是以换行符分隔的。此外,将输出通过管道传输到 grep 不会显示任何内容。

我尝试的下一种方法socat - udp-listen:8125给出的结果与 netcat 类似。

但是,当我传递 -v 平将 stderr 管道传输到 stdout,(socat -v - udp-listen:8125 2> &1 | grep ...)然后我得到了大致不错的结果,但是还有很多额外的不需要的输出。

我也尝试了 tshark,tshark -l -f "port 8125" -i ln0 -E separator=, -Tfields -e data但它会将输出打印为十六进制...而不是 ascii。我可以传入 -x 标志,这样可以并排打印十六进制和 ascii。这不是我想要的,而且对 grep 不太友好。我还尝试了许多其他 tshark 选项,但没有一个能够简单地打印 UDP 指标。

我见过一些例子,有人在做类似的事情,比如管道输出,| while read output; do echo $output; done;但是,我用这种方法并没有取得任何成功,而且我并不是一个真正的 unix 专家,所以我很难想出一个解决方案。

毕竟,这似乎不是一项不常见的任务,nc -ul 8125而且几乎那里....

为了提供更多背景信息...发送的代码如下所示:

var udpClient = new UdpClient();
udpClient.Connect("127.1", 9999);
while (true)
{
    var bytes = Encoding.UTF8.GetBytes("hi");
    udpClient.Send(bytes, bytes.Length);
    Thread.Sleep(1000);
}

期望的输出如下

hi
hi
hi
...

nc -ul 9999输出hihihihihi....

答案1

socat -u UDP-RECVFROM:8125,fork SYSTEM:"sed G"

虽然这似乎有效,但除了附加新线之外还有更多内容。也许这个帖子可以提供帮助:https://unix.stackexchange.com/questions/458951/how-can-i-add-message-delimiters-to-a-udp-stream-socat-is-piping

阐述其sed G工作原理...... sed有两个“空间”模式空间和保存空间。sed G基本上就是取图案空格并添加换行符。在这种情况下图案空间是空的,因此实际上只是添加了一个新行。

相关内容