2015-06-26 4 views
0

Я хочу, чтобы разобрать значение Mikrotik, вот что я получил: Но, когда я проверяю нет имени хоста в IP 192.168.10.5Анализировать по шаблону, Sed

active-address=192.168.10.1 
active-mac-address=XX:XX:XX:XX:XX:XX 
host-name="oXXXXX" 
active-address=192.168.10.2 
active-mac-address=XX:XX:XX:XX:XX:XX 
host-name="ZXXXXX" 
active-address=192.168.10.3 
active-mac-address=XX:XX:XX:XX:XX:XX 
host-name="OXXXXX" 
active-address=192.168.10.4 
active-mac-address=XX:XX:XX:XX:XX:XX 
host-name="AXXX" 
active-address=192.168.10.5 
active-mac-address=XX:XX:XX:XX:XX:XX 
active-address=192.168.10.6 <-- This is should be host-name 
active-mac-address=XX:XX:XX:XX:XX:XX 
host-name="TXXXX" 

Я хочу, чтобы добавить строку host-name="-" после макинтоша -адрес ИС 192.168.10.5
узор всегда же, как и что ..

active-address=192.168.10.1 
active-mac-address=XX:XX:XX:XX:XX:XX 
host-name="oXXXXX" 
active-address=192.168.10.2 
active-mac-address=XX:XX:XX:XX:XX:XX 
host-name="ZXXXXX" 
active-address=192.168.10.3 
active-mac-address=XX:XX:XX:XX:XX:XX 
host-name="OXXXXX" 
active-address=192.168.10.4 
active-mac-address=XX:XX:XX:XX:XX:XX 
host-name="AXXX" 
active-address=192.168.10.5 
active-mac-address=XX:XX:XX:XX:XX:XX 
host-name="-" <--- I want to append 
active-address=192.168.10.6 
active-mac-address=XX:XX:XX:XX:XX:XX 
host-name="TXXXX" 

Как я могу это сделать?

ответ

1

Generic sed, в котором обнаружены все отсутствующие имена хостов, при условии, что у всех есть активные адреса mac.

sed '/active-mac-address/{N;/host-name/!s/\n/\nhost-name="-"\n/}' file 

Как указал Эд, это умрет на solaris и не будет соответствовать окончательной строке файла.

+0

Да! Да!! Спасибо вам!! Спасибо!! Ааах, я действительно счастлив !!! Спасибо, что решили мою проблему !! –

+0

Это не удастся, если отсутствует имя хоста из последнего блока в файле. Это не универсальное sed, btw - использование '\ n' не переносимо, и некоторые seds (например, в Solaris) также задушили бы некоторые из других конструкций:' sed: команда garbled:/active-mac-address/{ N;!/s/\ п/\ nhost-имя-имя хоста/= "-" \ п /} '. –

+0

@ EdMorton Да, я заметил это, но команда станет немного непослушной, если она будет в конце. Также я не знал, что '/ n' не был переносимым, знаете ли вы какую-либо альтернативу? – 123

1

sed предназначен для простых подстановок на одной линии, то есть для всех. Все одноярусные конструкторы sednae, чтобы сделать что-либо еще, стали устаревшими в середине 1970-х годов, когда был изобретен awk.

Просто используйте AWK для ясности, простоты, надежности, расширяемости и большинство других желательных атрибутов программного обеспечения:

$ cat tst.awk 
/^active-address/ { prtRec() } 
{ rec = rec $0 ORS } 
END { prtRec() } 

function prtRec() { 
    if (rec != "") { 
     rec = rec (rec~/host-name/ ? "" : "host-name=\"-\"\n") 
     printf "%s", rec 
     rec = "" 
    } 
} 

$ awk -f tst.awk file 
active-address=192.168.10.1 
active-mac-address=XX:XX:XX:XX:XX:XX 
host-name="oXXXXX" 
active-address=192.168.10.2 
active-mac-address=XX:XX:XX:XX:XX:XX 
host-name="ZXXXXX" 
active-address=192.168.10.3 
active-mac-address=XX:XX:XX:XX:XX:XX 
host-name="OXXXXX" 
active-address=192.168.10.4 
active-mac-address=XX:XX:XX:XX:XX:XX 
host-name="AXXX" 
active-address=192.168.10.5 
active-mac-address=XX:XX:XX:XX:XX:XX 
host-name="-" 
active-address=192.168.10.6 
active-mac-address=XX:XX:XX:XX:XX:XX 
host-name="TXXXX" 

Обратите внимание, что выше, будет работать или нет имя хоста отсутствует от конца файл:

$ cat file2 
active-address=192.168.10.6 
active-mac-address=XX:XX:XX:XX:XX:XX 
$ 
$ awk -f tst.awk file2 
active-address=192.168.10.6 
active-mac-address=XX:XX:XX:XX:XX:XX 
host-name="-" 

Хотите получить результат в CSV или любой другой форме? Просто сделайте пару настроек для функции, которая печатает запись, например:

$ cat tst2.awk   
/^active-address/ { prtRec() } 
{ rec = rec $0 ORS } 
END { prtRec() } 

function prtRec() { 
    if (rec != "") { 
     rec = rec (rec~/host-name/ ? "" : "host-name=\"-\"\n") 
     sub(/^[^=]+=/,"",rec)  # tweak 1: remove leading "...=" 
     gsub(/\n[^=]+=/,",",rec) # tweak 2: change every "\n...=" to "," 
     printf "%s", rec 
     rec = "" 
    } 
} 

$ awk -f tst2.awk file 
192.168.10.1,XX:XX:XX:XX:XX:XX,"oXXXXX" 
192.168.10.2,XX:XX:XX:XX:XX:XX,"ZXXXXX" 
192.168.10.3,XX:XX:XX:XX:XX:XX,"OXXXXX" 
192.168.10.4,XX:XX:XX:XX:XX:XX,"AXXX" 
192.168.10.5,XX:XX:XX:XX:XX:XX,"-" 
192.168.10.6,XX:XX:XX:XX:XX:XX,"TXXXX" 
Смежные вопросы