awk + Печать строк до и после матча - PullRequest
0 голосов
/ 25 июня 2018

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

Я пытаюсь отфильтровать MAC-адрес и IP-адрес из вывода ifconfig.

      Link encap:Ethernet  HWaddr xx:xx:xx:xx:xx:xx
      inet addr:192.xx.xx.xx  Bcast:192.xx.xx.xx  Mask:255.255.255.0
      UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

В настоящее время я пытаюсь распечатать, сопоставив HWADDR, затем проверяя вторую строку, а затем следующую строку.

awk '/HWaddr/{printf $NF;printf " ";getline;print $2;}' <filename> | cut -c1-18,24-

xx: xx: xx: xx: xx: xx 192.168.xx.xx

мой вопрос, как искать в предыдущей строке. например: - Если я сопоставляю IP-адрес для второй строки, то как выполнить обратный поиск для первой строки, например,

 awk '/192/{printf $2;printf " ";<unknown>;}' <filename>

Здесь я сопоставляю IP, начиная с 192, основываясь на проверке предыдущей строки. Могу ли я узнать, что такое обратный поиск для getline, я имел в виду, какова директива для обратного поиска

ищет только с помощью утилиты awk

Ответы [ 2 ]

0 голосов
/ 25 июня 2018

Самый простой способ сделать это - просто сохранить предыдущую строку в переменной, а затем ссылаться на нее, когда вам это нужно.Например, с помощью следующего скрипта awk:

/192/ {print lastline}
{ lastline=$0 }

Если я дам ему следующий результат:

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 64:00:6a:7d:06:1a brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.24/24 brd 192.168.1.255 scope global dynamic eth0
       valid_lft 67513sec preferred_lft 67513sec
    inet6 fe80::5da1:2401:a725:d2e0/64 scope link 
       valid_lft forever preferred_lft forever

Я получу в качестве вывода:

link/ether 64:00:6a:7d:06:1a brd ff:ff:ff:ff:ff:ff

Конечно, интерфейсы могут иметь несколько адресов, и это может привести к сбою, если ваш интерфейс выглядит, например:

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 64:00:6a:7d:06:1a brd ff:ff:ff:ff:ff:ff
    inet 172.16.32.1/24 brd 172.16.32.255 scope global dynamic eth0
       valid_lft 67513sec preferred_lft 67513sec
    inet 192.168.1.24/24 brd 192.168.1.255 scope global dynamic eth0
       valid_lft 67513sec preferred_lft 67513sec
    inet6 fe80::5da1:2401:a725:d2e0/64 scope link 
       valid_lft forever preferred_lft forever

Вместо того, чтобы смотреть на «предыдущую строку», лучше явно записать MAC-адрес:

/192/ {print hwaddr}
/link\/ether/ {hwaddr=$0}

Это всегда будет печатать значение предыдущей строки link/ether.

0 голосов
/ 25 июня 2018

Не могли бы вы попробовать и сообщите мне, поможет ли это вам.

awk '/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/{print $2 OFS prev} {prev=$0}' Input_file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...