解析非常规命令输出

Parsing a non-regular command output

我在 LEDE OS 上有 iperf 版本 2 运行 的以下输出。我正在尝试解析输出以获取 Mbits/sec 之前的数字,这是 IPERF 会话的平均吞吐量。但是,似乎每列之间的分隔与一定数量的空格或制表符不匹配。另外,iperf 生成的 CSV 格式会产生奇怪的结果,因此我不得不依赖 iperf 的常规输出。关于如何使用正则表达式或 awk 命令解析输出有什么建议吗?

iperf命令:

iperf -c 10.0.0.7 -t 10 -i 0.1 -f m

输出:

[  3] 0.00-10.00 sec  1889 MBytes  1584 Mbits/sec  15114/0          0     
2483K/3302 us

你可以使用 grep

iperf -c 10.0.0.7 -t 10 -i 0.1 -f m | grep -o -E '\w+ Mbits/sec'

或者更准确地说:

iperf -c 10.0.0.7 -t 10 -i 0.1 -f m | grep -o -E '[0-9]+ Mbits/sec'

要仅获取数字,您可以使用另一个正则表达式,

iperf -c 10.0.0.7 -t 10 -i 0.1 -f m | grep -Po '[[:digit:]]+ *(?=Mbits/sec)'

以上,[[:digit:]]+[0-9]+相同,匹配行中的数字。

对于 MacOS X 中的 FreeBSD grep,-P 将不起作用。而是直接使用perl

iperf -c 10.0.0.7 -t 10 -i 0.1 -f m | perl -nle 'print $& if m{\d+ *(?=Mbits/sec)}'

你猫试试用awk工具:

iperf -c 10.0.0.7 -t 10 -i 0.1 -f m | awk -F 'MBytes' {'print '} 

如果这是 iperf 2,则尝试 -fb 进行 bit/byte 格式化。这种格式更容易解析 w/regular 表达式,因为它只是一个数字。 Man page is here.

`常规选项

-f, --format [abkmgBKMG] 要报告的格式:自适应、位、字节、千位、兆位、千兆位、千字节、兆字节、千字节(更多信息请参见注释)`