Парсинг данных из ifconfig с помощью awk или sed? - PullRequest
2 голосов
/ 02 апреля 2012

Я пытаюсь проанализировать некоторые данные из вывода ifconfig с помощью sed, но я не могу сделать это правильно.Я хочу, чтобы команда извлекла только число, за которым я следую.

Например, меня интересует извлечение отправленных байтов:

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 голосов
/ 02 апреля 2012

ИМХО, нет стандарта для ifconfig - выхода. Он (может) меняться от системы к системе и от выпуска к выпуску.

На вашем месте я бы выбрал файловую систему /sys. Вы также получаете всю информацию оттуда - без необходимости последующей обработки.

$ cat /sys/class/net/eth0/statistics/rx_bytes
37016050
9 голосов
/ 02 апреля 2012

использование grep:

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

использование awk:

ifconfig | awk -F: '/RX bytes/{print $2+0}'
1 голос
/ 02 апреля 2012

По умолчанию sed печатает каждую строку ввода после любых изменений, которые вы внесли в строку. Поскольку вы хотите распечатать только что-то из строки с помощью «байтов RX», вы говорите sed не печатать каждую строку (-n). Таким образом, вы хотите указать диапазон, в котором следует выполнить подстановку, только строку, соответствующую RX bytes, а затем выполнить подстановку и явно распечатать результаты.

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