如何使用 iperf 输出并且仅 grep Interval 和 Bandwidth?

如何使用 iperf 输出并且仅 grep Interval 和 Bandwidth?

我正在尝试获取命令的输出

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 22每秒打印一份报告

在接下来的一个小时里,每隔两秒钟就会在屏幕上打印(添加)一行这样的内容:

[  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

相关内容