从STDOUT中的不同位置提取Bash号码

时间:2015-11-19 18:41:11

标签: bash awk sed grep speed-test

以下是speedtest-cli给出的输出:(用测试数据编辑的个人信息)

Retrieving speedtest.net configuration...
Retrieving speedtest.net server list...
Testing from ------ (xxx.xxx.xxx.xxx)...
Selecting best server based on latency...
Hosted by ------- (------, --) [15.00 km]: 50.00 ms
Testing download speed........................................
Download: 60.00 Mbit/s
Testing upload speed..................................................
Upload: 10.00 Mbit/s

我希望输出是逗号分隔的ping行,dl,ul:

50.00, 60.00, 10.00

我一直在研究解决方案,并提出了这个问题:

speedtest-cli | sed -n "5p;7p;9p" | grep -oE "[[:digit:]]{1,}" | tr '\n' ,

哪个输出:

15,00,50,00,60,00,10,00,

哪个接近我想要的。除了它包括距离第5行的距离(15.00km)并且基于分裂。同样。有没有更好的方法来使用awk或类似的东西?

2 个答案:

答案 0 :(得分:5)

使用awk你可以这样做:

speedtest-cli | awk -v ORS=', ' '/^(Hosted|Download|Upload)/{print $(NF-1)}'
50.00, 60.00, 10.00,

使用换行符而不是尾随,使用:

speedtest-cli | awk -v ORS=', ' '/^(Hosted |Download:)/{print $(NF-1)}
      /^Upload:/{printf "%s%s", $(NF-1), RS}'
50.00, 60.00, 10.00

答案 1 :(得分:2)

如果您的grep支持PCRE(-P),则可以执行以下操作:

% grep -Po '^(Hosted|Download|Upload).*:\K [^ ]+' file.txt | tr '\n' ','; echo
 50.00, 60.00, 10.00,

所以:

speedtest-cli | grep -Po '^(Hosted|Download|Upload).*:\K [^ ]+' | tr '\n' ','; echo