2011-08-06 72 views
1

我想管tshark輸出到awk。 tshark命令可以正常工作,並且在連接到其他程序(如cat)時,它可以正常工作(實時打印輸出)。但是,當傳輸awk時,它掛起而沒有任何反應。管道到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)}' 

這裏是一個simplier版本:

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 

在此先感謝。

+0

請問什麼OS /版本的Linux。另外如果你的系統有'unbuffer',請嘗試添加到混合中。不是一個漂亮的解決方案,但如果你需要它的工作,這可能會做到。祝你好運。 – shellter

+0

使用Ubuntu 11.04。我有一個非緩衝的去,但沒有運氣 - 它只是掛起。 – Kevin

+0

您的問題已有詳細記錄。但是......假設你使用'cat'的最後一個例子也適用於所有tshark的選項,即'-T fields ...'的使用?看起來'awk'應該沒有問題處理輸出。另外,當你從圖片中取出「sudo」會發生什麼?祝你好運。 – shellter

回答

2

根據我們之前在評論中的消息,也許它會強制關閉輸入併發出換行。

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

注意,awk和printf之間沒有管道。

我希望這會有所幫助。

+0

這大大增加了響應時間。它仍然不是即時的,但是,這很奇怪。我會嘗試使用除awk之外的其他東西。感謝您的幫助。 – Kevin

+0

您可能不需要'printf',但保留{...}包裝器。祝你好運。 – shellter

4

我有同樣的問題。

我發現一些不完全便攜的部分「解決方案」。 他們中的一些點使用

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

我都嘗試,沒有工作的fflush()或沖洗()AWK功能或-W互動選項。所以awk根本不是合適的命令。

他們中的一些人建議使用gawk,但它對我來說既不能解決問題。

cut命令有同樣的問題。

我的解決辦法:在我來說,我只是需要把--line緩衝在grep和不接觸awk命令,但在你的情況我會嘗試:

sed -u 

與適當的正則表達式。例如:

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

該表達式爲您提供第三和第四列通過TAB(帶CTRL + V和TAB組合寫的)中分離出來。使用-u選項可以獲得無緩衝的輸出,並且還有-l選項可以爲您提供線路緩衝輸出。

希望你覺得這個回答有用,雖然晚了