使用awk或sed从ifconfig解析数据?

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二进制文件,所以我的选择有限。

3个回答

14

在我看来,ifconfig 的输出没有标准。它可能因系统和版本的不同而有所改变。

如果我是你,我会选择使用 /sys 文件系统。从那里获取的所有信息都可以不需要后期处理。

$ cat /sys/class/net/eth0/statistics/rx_bytes
37016050

那将是理想的答案,但我正在使用的Linux系统相当古老,没有可用的/sys文件系统。 - fazineroso
你正在使用哪个Linux系统?/proc/net/dev是否可用? - Andreas Florath
这是一个带有旧的2.6.x内核的嵌入式系统。/proc/net/dev可用。我认为从'ifconfig'解析数据比从/proc/net/dev更容易。 - fazineroso
这些内容被 ifconfig(8) 程序用于报告设备状态。/proc/net/dev 的 man 页面。在我看来,/proc 接口已经定义得很清楚了。 - Andreas Florath

10

使用 grep

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

使用 awk:

ifconfig | awk -F: '/RX bytes/{print $2+0}'

谢谢。它可以工作,但不幸的是我需要在一个有限命令(busybox)的系统上使用它。有其他替代方案吗? - fazineroso
2
你可能已经找到了一个好的替代方案,但这是我的(在OpenWRT的busybox上测试过):awk '/eth0: / { print $2; }' /proc/net/dev - Laszlo Valko

1
默认情况下,sed会打印出输入的每一行,在您对该行进行任何更改后。由于您只想从带有“RX字节”的行中打印出某些内容,因此您告诉sed不要打印每一行(-n)。因此,您需要指定应执行替换的范围,仅匹配RX字节的行,然后执行替换并显式打印结果。
ifconfig eth1 | sed '/RX bytes/{s|.*RX bytes:\([0-9]*\).*|\1|; p}'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接