如何将watch命令输出解析为最后5位数?

时间:2013-05-21 15:48:23

标签: regex shell ubuntu command-line

从命令

watch -n1 "ifconfig eth0 | grep GiB" 

我的输出如下,

RX bytes:730624111504 (680.4 GiB)  TX bytes:31815434434 (29.6 GiB)

现在我只想要前五位数(GiB)。我为它写了一个正则表达式,似乎work

(\d{1,4})(?!.*\d)\sGiB

唯一的问题是我无法使用上面显示的命令。

有什么想法吗?

更新这是我想要的

  

RX字节:730624111504(680.4 GiB)TX字节:31815434434(29.6 GiB)

匹配RX为

  

4111504和5434434

我的正则表达式适用于http://www.rubular.com/r/HtwFxjCIJm但不适用于命令

3 个答案:

答案 0 :(得分:2)

这应该有效

watch -n1 "ifconfig eth0 | grep GiB | awk '{print substr(\$2, length(\$2) -5), substr(\$6, length(\$6) -5) }'"

正如@Kent指出的那样,你可以(应该)摆脱grep,只使用awk,就像这样:

watch -n1 "ifconfig eth0 | awk '\$0~/GiB/{print substr(\$2, length(\$2) -5), substr(\$6, length(\$6) -5) }'"

答案 1 :(得分:1)

在Ubuntu上测试:

echo 'RX bytes:730624111504 (680.4 GiB) TX bytes:31815434434 (29.6 GiB)' |
grep -Po '(\d{7})\s\(.*?GiB\)' | grep -Po '\d{7}'
4111504
5434434

答案 2 :(得分:1)

用这个替换你的grep:

grep -Po '\d{7}(?=\s*\(.*GiB)'

一些注意事项:

  • 您的示例显示的不是 5 数字,但 7
  • 您的正则表达式中已经硬编码GiB,如果您的服务器重新启动,或者您的网络接口不断向上,您的命令可能无法正常运行。因为它以KiB or Mib
  • 开头