3

我正在尝试使用 sed 解析 ifconfig 输出中的一些数据,但我无法正确执行。我希望该命令仅提取我所追求的数字。

例如,我有兴趣提取发送的字节:

eth1      Link encap:Ethernet  HWaddr 00:00:00:09:15:f7  
      inet addr:192.168.1.2  Bcast:192.168.1.255  Mask:255.255.255.0
      inet6 addr: fe80::92e2:baff:fe08:35c7/64 Scope:Link
      UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
      RX packets:75141 errors:0 dropped:0 overruns:0 frame:0
      TX packets:78046 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:1000 
      RX bytes:9040489 (9.0 MB)  TX bytes:34806464 (34.8 MB)

如果我使用 sed:

ifconfig eth1 | sed 's|.*RX bytes:\([0-9]*\).*|\1|g'

我得到这个输出:

eth1      Link encap:Ethernet  HWaddr 00:00:00:09:15:f7  
      inet addr:192.168.1.2  Bcast:192.168.1.255  Mask:255.255.255.0
      inet6 addr: fe80::92e2:baff:fe08:35c7/64 Scope:Link
      UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
      RX packets:75141 errors:0 dropped:0 overruns:0 frame:0
      TX packets:78046 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:1000 
9040627

但我只对'9040627'感兴趣有没有办法用sed来做,或者我应该使用awk或其他替代品吗?

编辑:我使用的是busybox二进制文件,所以我的选择是有限的。

4

3 回答 3

14

ifconfig恕我直言, - 输出没有标准。它(可能)从一个系统到另一个系统,从一个版本到另一个版本。

如果我是你,我会选择/sys文件系统。您也可以从那里获得所有信息 - 无需后处理。

$ cat /sys/class/net/eth0/statistics/rx_bytes
37016050
于 2012-04-02T13:28:30.510 回答
10

使用grep

ifconfig | grep -oP '(?<=RX bytes:)[0-9]*'

使用awk

ifconfig | awk -F: '/RX bytes/{print $2+0}'
于 2012-04-02T13:01:26.723 回答
1

默认情况下,sed 会在您对该行进行任何更改后打印出输入的每一行。由于您只想从带有“RX 字节”的行中打印出一些内容,因此您告诉 sed 不要打印每一行 ( -n)。因此,您要指定应执行替换的范围,仅匹配匹配的行,RX bytes然后进行替换并显式打印结果。

ifconfig eth1 | sed '/RX bytes/{s|.*RX bytes:\([0-9]*\).*|\1|; p}'
于 2012-04-02T13:12:56.463 回答