我正在尝试捕获作为 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
基本上就是取图案空格并添加换行符。在这种情况下图案空间是空的,因此实际上只是添加了一个新行。