如何擷取 UDP 流量,以便將其通過管道傳輸到 grep
我正在嘗試擷取作為 StatsD 指標發送的 UDP 流量(在埠 8125 上)。
我嘗試過的最簡單的方法是執行
nc -ul 8125
將指標列印到終端……但它們不是換行符分隔的。此外,將輸出傳送到 grep 不會顯示任何內容。我嘗試的下一個方法是
socat - udp-listen:8125
與 netcat 給出類似的結果。但是,當我將 -v flat和管道 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。不是我想要的,也不是很友好。我還嘗試了許多其他 tshark 選項,但沒有任何東西能夠簡單地列印 UDP 指標。我已經看到一些例子,其中有人做類似的事情是 pipling output like
| 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....
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
基本上採用模式空間中的內容並為其添加換行符。在這種情況下,模式空間是空的,因此它實際上只是添加了一個新行。