我创建了一个不错的小命令来测量计量连接上的数据带宽消耗(不包括本地流量):
sudo iftop -i enp1s0 -f '不是 (src net (10 或 172.16/12 或 192.168/16) 和 dst net (10 或 172.16/12 或 192.168/16))' -t -L1 2> /dev/null | awk '$1 == "Cumulative" {print $5 ;}'
如果你给它一些时间,你会看到它将开始打印包含字节数据的行(我猜是 stdout)。
我尝试了很多方法试图将这些行写入文件,包括 1>、>、>>、tee 等的几种变体。在重定向 awk 输出时,似乎没有任何效果。
答案1
您的问题是,如果 awk 检测到其输出不是终端,它会切换到缓冲输出;您只需等待更长时间才能出现任何输出。
如果您不想等待,请使用:
sudo iftop -i enp1s0 -f 'not (src net (10 or 172.16/12 or 192.168/16) and dst net (10 or 172.16/12 or 192.168/16))' -t -L1 2> /dev/null | awk '$1 == "Cumulative" {print $5; fflush(); }'
(这fflush()
将导致立即打印所有行,虽然效率较低,但可以让您立即看到它。)
答案2
将重定向与 sudo 混合使用可能会造成混淆。我会在新的 shell 中运行管道,重定向可以转到那里:
sudo sh <<'END_IFTOP'
filter="not (src net (10 or 172.16/12 or 192.168/16) and dst net (10 or 172.16/12 or 192.168/16))"
iftop -i enp1s0 -f "$filter" -t -L1 2> /dev/null |
awk '$1 == "Cumulative" {print $5}' > $HOME/output.file
END_IFTOP