如何告诉工具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 的输出不同,sole 的输出中会出现完整的块,中间会有暂停。这要归咎于和
iftop -t
之间的缓冲。在我的测试中iftop
awk
stdbuf -oL iftop …
幫助了。 iftop
将一些消息打印到 stderr。除非您使用,否则它们不会通过管道iftop … 2>&1 | …
。