无法将 awk 输出重定向到文件...尝试了所有方法

无法将 awk 输出重定向到文件...尝试了所有方法

我创建了一个不错的小命令来测量计量连接上的数据带宽消耗(不包括本地流量):

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

相关内容