我试图用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二进制文件,因此我的选项有限。
答案 0 :(得分:14)
恕我直言,ifconfig
- 输出没有标准。它(可能)从一个系统变为另一个系统,从发布到发布。
如果我是你,我会选择/sys
文件系统。您也可以从那里获得所有信息 - 无需后期处理。
$ cat /sys/class/net/eth0/statistics/rx_bytes
37016050
答案 1 :(得分:9)
grep
:ifconfig | grep -oP '(?<=RX bytes:)[0-9]*'
awk
:ifconfig | awk -F: '/RX bytes/{print $2+0}'
答案 2 :(得分:1)
默认情况下,sed会在您对该行进行任何更改后打印出输入的每一行。由于您只想打印带有“RX字节”的行中的内容,因此您告诉sed不要打印每一行(-n
)。因此,您希望指定应执行替换的范围,仅指定与RX bytes
匹配的行,然后执行替换并显式打印结果。
ifconfig eth1 | sed '/RX bytes/{s|.*RX bytes:\([0-9]*\).*|\1|; p}'