0

从命令

watch -n1 "ifconfig eth0 | grep GiB" 

我在下面给出了输出,

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

现在我只想要(GiB)之前的最后 5 位数字。我为它写了一个正则表达式,它似乎工作

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

唯一的问题是我不能将它与上面显示的命令一起使用。

有任何想法吗?

更新这是我想要的

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

匹配 RX 为

4111504 和 5434434

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

4

3 回答 3

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) }'"

于 2013-05-21T16:09:55.500 回答
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
于 2013-05-21T16:18:39.587 回答
1

用这个替换你的grep:

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

一些注意事项:

  • 您的示例显示的不是5位数,而是7
  • 您已经GiB在正则表达式中进行了硬编码,如果您的服务器重新启动,或者您的网络接口关闭和启动,您的命令可能无法正常工作。因为它开始于KiB or Mib
于 2013-05-21T16:20:01.217 回答