Распарсить вывод

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Grih65kop
Сообщения: 145

Распарсить вывод

Сообщение Grih65kop »

Неполучается привести данный список:

Код: Выделить всё

Scan report for shop-a-w.dor.ru (192.168.40.1)
Host is up (0.00044s latency).
MAC Address: AA:AA:F9:01:05:08 (Unknown)
Scan report for shop2-a-w.dor.ru (192.168.40.3)
Host is up (0.00044s latency).
MAC Address: AA:AA:W3:01:0f:02 (Unknown)


к следующему содержанию:

Код: Выделить всё

192.168.40.1 shop-a-w.dor.ru AA:AA:F9:01:05:08
192.168.40.3 shop2-a-w.dor.ru AA:AA:W3:01:0f:02


Начал следующим образом:
awk '/192/ {printf $5 " " $4 "\n"}'
awk '/MAC/ {print $3}'
Но нужен вывод в одну строку.
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5456
ОС: Gentoo

Re: Распарсить вывод

Сообщение /dev/random »

sed -n '/^Scan report/{N;N;s/.* for \([^ ]*\) (\([^)]*\)).*Address: \([^ ]*\).*/\2 \1 \3/p}'
Спасибо сказали:
Grih65kop
Сообщения: 145

Re: Распарсить вывод

Сообщение Grih65kop »

Спасибо за помощь.
Но некотырые строки не берет. Например:

Код: Выделить всё

Scan report for mx1.dor.ru (192.168.40.6)
Host is up.
Scan report for aqv01.dor.ru (192.168.40.7)
Host is up (0.00030s latency).
MAC Address: 00:80:86:H1:44:17 (VMware)

То что 192.168.40.6 это понятно, sed не встретил "Address", а вот почему 192.168.40.7 не понимаю. Подскажите как вылечить.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Распарсить вывод

Сообщение drBatty »

Grih65kop писал(а):
06.02.2013 18:36
То что 192.168.40.6 это понятно, sed не встретил "Address"

да. Не встретил. Но строчку двойное NN проглотило. Самое простое - отловить этот случай командой перехода, очистить одну строчку командой D, и ещё раз проверить.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Grih65kop
Сообщения: 145

Re: Распарсить вывод

Сообщение Grih65kop »

К сожалению, не смог добиться результата с sed.

Мне бы подошел и верхний вариант с awk т.е. выбирать ИП-адрес, ДНС имя, MAC по отдельности их затем соеденить при помощи past. Но проблема в том что если в какой то одной строке нет нужного текста для извлечения, то все последующие извлеченные строки сдвинутся и в дальнейшем выйдет беспорядок. Т.е. ИП-адресу уже не будет соответствовать его ДНС имя. Может быть этого можно как то избежать?
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Распарсить вывод

Сообщение NickLion »

Могу предложить однострочник на perl'е:

Код: Выделить всё

perl -e '$f="";while(<>){if(/^Scan report for (\S+) \((\S+)\)/){print"$f$2 $1"; $f="\n"} if(/^MAC Address: (\S+)/){print" $1"}}print"\n"'

который из

Код: Выделить всё

Scan report for shop-a-w.dor.ru (192.168.40.1)
Host is up (0.00044s latency).
MAC Address: AA:AA:F9:01:05:08 (Unknown)
Scan report for shop2-a-w.dor.ru (192.168.40.3)
Host is up (0.00044s latency).
MAC Address: AA:AA:W3:01:0f:02 (Unknown)
Scan report for mx1.dor.ru (192.168.40.6)
Host is up.
Scan report for aqv01.dor.ru (192.168.40.7)
Host is up (0.00030s latency).
MAC Address: 00:80:86:H1:44:17 (VMware)

делает

Код: Выделить всё

192.168.40.1 shop-a-w.dor.ru AA:AA:F9:01:05:08
192.168.40.3 shop2-a-w.dor.ru AA:AA:W3:01:0f:02
192.168.40.6 mx1.dor.ru
192.168.40.7 aqv01.dor.ru 00:80:86:H1:44:17


Или записи без MAC вообще не должны попадать в вывод?
Спасибо сказали:
Grih65kop
Сообщения: 145

Re: Распарсить вывод

Сообщение Grih65kop »

Спасибо. Должны попадать.

Для себя я пока решил делать так, сперва выводить нужные параметры одного хоста в одну строку:

Код: Выделить всё

cat ./1|tr -d "\n"|sed 's/Scan\ report\ for\ /\n/g;s/)/\ /g;s/(/\ /g'

в итоге у нас будет:

Код: Выделить всё

shop-a-w.dor.ru  192.168.40.1 Host is up  0.00044s latency .MAC Address: AA:AA:F9:01:05:08  Unknown
shop2-a-w.dor.ru  192.168.40.3 Host is up  0.00044s latency .MAC Address: AA:AA:W3:01:0f:02  Unknown
mx1.dor.ru  192.168.40.6 Host is up.
aqv01.dor.ru  192.168.40.7 Host is up  0.00030s latency .MAC Address: 00:80:86:H1:44:17  VMware

Теперь осталось разобраться как выводить нужные параметры и не пропускать строку если их нет, а так же что бы не происходило смещение (awk '{print $2 " " $1 " " $10}' для этог не совсем подходит).
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Распарсить вывод

Сообщение NickLion »

Можно дополнить

Код: Выделить всё

 | sed -r 's/^(\S+)\s+(\S+)\s+Host is up((.\s*$)|(.*Address:( \S+).*$))/\2 \1\6/g'
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4824
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: Распарсить вывод

Сообщение SLEDopit »

Код: Выделить всё

sed -n ':a;/Scan/!d;{s/.*for \([^(]*\) (\([0-9.]*\).*/\2 \1/;h};n;/^Host/!{x;p;x;ba;};n;/^MAC/!{x;p;x;ba;};s/.* \([A-Z0-9:]*\) .*/\1/;H;x;s/\n/ /g;p'

для красоты в конец можно column -t добавить
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Распарсить вывод

Сообщение drBatty »

мой вариант:

$

$ sed -rn ':l;s/^Scan report for\s+(\S+)\s+\((.*)\)\s*$/\2 \1/p;T;h;n;n;s/^MAC Address:\s+(\S+)\s+.*/~\1/p;Tl' t.txt | sed -n 'N;s/\n~/ /p;t;P;D' 192.168.40.1 shop-a-w.dor.ru AA:AA:F9:01:05:08 192.168.40.3 shop2-a-w.dor.ru AA:AA:W3:01:0f:02 192.168.40.6 mx1.dor.ru 192.168.40.7 aqv01.dor.ru 00:80:86:H1:44:17

http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4824
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: Распарсить вывод

Сообщение SLEDopit »

drBatty писал(а):
07.02.2013 14:31
мой вариант:
Если строка с Host потеряется, то часть вывода пропадёт.
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Распарсить вывод

Сообщение drBatty »

SLEDopit писал(а):
07.02.2013 14:54
Если строка с Host потеряется, то часть вывода пропадёт.

да. Но вроде по логике оно всегда есть (в смысле какая-то строка, типа host is down)
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали: