简体   繁体   中英

Parsing data from ifconfig with awk or sed?

I am trying to parse some data from ifconfig output with sed, but I am not able to do it correctly. I want the command to extract just the number I am after.

For example, I am interested in extracting the bytes sent:

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)

If I use sed:

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

I get this output:

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

But I am only interested in '9040627' Is there a way to do it with sed, or should I use awk or other alternatives?

Edit: I am using busybox binaries, so my options are limited.

IMHO there is no standard for the ifconfig - output. It (may) change from system to system and from release to release.

If I were you, I would go for the /sys file system. You get all the information also from there - without the need of post-processing.

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

use grep :

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

use awk :

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

By default, sed prints out each line of the input, after any changes you've made to the line. Since you only want to print out something from the line with "RX bytes", you tell sed not to print every line ( -n ). So you want to specify the range on which the substitution should be performed, only the line that matches RX bytes , and then do the substitution and explicitly print the results.

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM