使用awk或sed从ifconfigparsing数据?

我想parsingsed的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还是其他的select?

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

使用grep

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

使用awk

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

恕我直言,没有标准的ifconfig – 输出。 它(可能)从系统到系统,从发布到发布。

如果我是你,我会去/sys文件系统。 你也可以从那里获得所有的信息,而不需要后处理。

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

默认情况下,在对行进行任何更改之后,sed会打印输出的每一行。 既然你只想打印出“RX bytes”的行,你就告诉sed不要打印每一行( -n )。 所以你要指定应该执行替换的范围,只有与RX bytes匹配的行,然后进行替换,并显式地打印结果。

 ifconfig eth1 | sed '/RX bytes/{s|.*RX bytes:\([0-9]*\).*|\1|; p}'