我正在尝试获取命令的输出
iperf -c 10.0.0.1 -t 3600 -i 2
并且只需要列出整个小时的记录的间隔和带宽字段。
我已很多年没有使用过 grep 或 awk 了。
帮助将会非常棒!
示例输出:
------------------------------------------------------------
Client connecting to node2, TCP port 5001
TCP window size: 129 KByte (WARNING: requested 130 KByte)
------------------------------------------------------------
[ 3] local <IP Addr node1> port 2530 connected with <IP Addr node2> port 5001
[ ID] Interval Transfer Bandwidth
[ 3] 0.0-10.0 sec 19.7 MBytes 15.8 Mbits/sec
期望输出:
0.0-10.0 15.8
答案1
仅根据您发布的iperf
输出,您只需从最后一行打印字段 3 和 4:
| awk 'END{print $3" "$7}'
但这个问题并不单单是关于awk
。
问题:
让我们首先解释一下您的iperf
命令的作用,以便那些不熟悉它的人能够理解。
-c 10.0.0.1
连接到监听地址的服务器10.0.0.1
-t 3600
持续运行3600
数秒,即 1 小时-i 2
2
每秒打印一份报告
在接下来的一个小时里,每隔两秒钟就会在屏幕上打印(添加)一行这样的内容:
[ 3] 0.0-10.0 sec 19.7 MBytes 15.8 Mbits/sec
您想要的是将每两秒打印在屏幕上的信息减少到以下形式:
0.0-10.0 15.8
回答:为了获得此结果,您可以将输出传输至awk
:
iperf -c 10.0.0.1 -t 3600 -i 2 | awk '/[0-9]]/{sub(/.*]/,"");print $1" "$5}'
iperf
如果您使用,即 iperf 2,那么您可以停止阅读。
如果你使用iperf3
,你现在应该已经发现管道输出被缓冲了。这意味着你不是每两秒在屏幕上打印一行新行!相反,每 50 秒左右会打印一大堆行,具体取决于系统。请注意,iperf 2 不会发生这种情况,因为它会在打印每行后刷新输出。
为了在屏幕上以所需的间隔打印出所需形式的一行,您需要--forceflush
:
--forceflush force flushing output at every interval. Used to avoid buffer- ing when sending output to pipe.
回答:
iperf3 -c 10.0.0.1 -t 3600 -i 2 --forceflush | awk '/[0-9]]/{sub(/.*]/,"");print}'
请注意,此选项已添加到iperf3
版本3.1.5
。