
如何告訴工具iftop
在文字模式下列印一次活動連線的快照而不循環?
iftop -t -i eth2
答案1
好像沒有辦法告訴 iftop -t
列印一大塊而不是循環。
作為比較:top -b -n 1
可以做你想做的事,相關選項是-n 1
。這是一個不同的工具,但這個範例顯示了當該工具支援該選項時它是多麼容易(注意:iftop
理解-n
,但它是一個不同的,不相關的選項)。
您仍然可以解析輸出並在第一個區塊之後停止。在我的 Debian 10 中,iftop -t
每個區塊都以包含許多字元的行結束=
。這似乎^==
是一個很好的正規表示式,可以檢測區塊的結尾而不會出現誤報。
此命令在第一個區塊之後退出:
iftop -t -i eth2 | sed '/^==/ q'
或者:
iftop -t -i eth2 | awk '{print; if ($0 ~ "^==") exit}'
要在第 N 個區塊之後退出,我們需要更複雜的程式碼。在以下範例中,N 為 3 n=3
。
iftop -t -i eth2 | awk -v n=3 '
BEGIN {if (n<=0) exit}
{
print
if ($0 ~ "^==") n--
if (n<=0) exit
}'
筆記:
- 當
awk
(或sed
) 退出時,iftop
不會立即通知。SIGPIPE
只有當它嘗試向現在損壞的管道寫入更多內容時,它才會得到。這意味著整個命令將停止,直到iftop
生成另一個區塊(不會被列印)。這個是正常的。在這件事上進行優化iftop
沒有什麼意義,它不會永遠停滯不前。比較它有何意義tail
。 - 如果整個命令列印到控制台,您可能會看到輸出在區塊中間暫停。此行為與sole 的輸出不同
iftop -t
,其中完整的區塊出現,中間有暫停。iftop
和之間的緩衝awk
是罪魁禍首。在我的測試中stdbuf -oL iftop …
幫助了。 iftop
向 stderr 列印一些訊息。它們不會穿過管道,除非您使用iftop … 2>&1 | …
.