Фильтровать текст на основе критериев многострочного соответствия - PullRequest
2 голосов
/ 25 августа 2010

У меня есть следующая команда sed. Мне нужно выполнить приведенную ниже команду в одну строку

cat File | sed -n '      
/NetworkName/ {
N
/\n.*ims3/ p
}' | sed -n 1p | awk -F"=" '{print $2}'

Мне нужно выполнить вышеуказанную команду в одной строке. Может кто-нибудь, пожалуйста, помогите.

Предположим, что содержимое файла

System.DomainName=shayam
System.Addresses=Fr6
System.Trusted=Yes
System.Infrastructure=No
System.NetworkName=AS
System.DomainName=ims5.com
System.DomainName=Ram
System.Addresses=Fr9
System.Trusted=Yes
System.Infrastructure=No
System.NetworkName=Peer
System.DomainName=ims7.com
System.DomainName=mani
System.Addresses=Hello
System.Trusted=Yes
System.Infrastructure=No
System.NetworkName=Peer
System.DomainName=ims3.com

И после выполнения команды вы получите только peer в качестве вывода. Может кто-нибудь помочь мне?

Ответы [ 6 ]

1 голос
/ 25 августа 2010

Вы можете использовать одну команду nawk. И вы можете потерять бесполезного кота

nawk -F"=" '/NetworkName/{n=$2;getline;if($2~/ims3/){print n} }' file

Вы можете использовать sed так же, как предложили другие, но я предпочитаю меньше регулярных выражений и меньше беспорядка. Выше сохраните значение имени сети в «n». Затем найдите следующую строку и проверьте 2-е поле по отношению к «ims3». Если найдено совпадение, выведите значение «n».

1 голос
/ 25 августа 2010

Поместите этот код в отдельный файл .sh и запустите его как однострочную команду.

0 голосов
/ 25 августа 2010

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

sed -n -e '/NetworkName/ {' -e 'N' -e '/\n.*ims3/ s/[^\n]*=\(.*\).*/\1/P' -e '}' File
0 голосов
/ 25 августа 2010

Предполагая, что вам нужно сетевое имя для домена ims3 , эта командная строка работает без sed :

grep -B 1 ims3 File | head -n 1 | awk -F"=" '{print $2}'
0 голосов
/ 25 августа 2010
cat File | sed -n '/NetworkName/ { N; /\n.*ims3/ p }' | sed -n 1p | awk -F"=" '{print $2}'
0 голосов
/ 25 августа 2010

Итак, вам нужно имя сети, в котором имя домена в следующей строке включает в себя «ims3», а не имя, в котором в следующей строке содержится «ims7» (даже если сетевые имена в примере совпадают).

sed -n '/NetworkName/{N;/ims3/{s/.*NetworkName=\(.*\)\n.*/\1/p;};}' File

Это также позволяет избежать злоупотребления кошачьими (не говоря уже о сокращении числа выполняемых команд).

Протестировано на MacOS X 10.6.4, но нет причин думать, что оно не будет работать и в других местах .


Однако эмпирические данные показывают, что Solaris sed отличается от MacOS sed. Все это можно сделать одной командой sed, но для этого нужно три строки:

sed -n '/NetworkName/{N
/ims3/{s/.*NetworkName=\(.*\)\n.*/\1/p;}
}' File

Проверено на Solaris 10.

...