2010-08-25 3 views
2

У меня есть следующая команда 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 

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

+1

Если вы ищете просто "Peer", это способ проще: "Кошка файла | Grep Peer" , чтобы вы начали. –

ответ

1

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

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

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

+0

Работает .. Спасибо :) :) – Raj

+1

Это может быть немного яснее: 'nawk -F = '/ NetworkName/{name = $ 2} $ 2 ~/ims3/{print name}'' –

1

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

+0

Это уклоняется от проблемы. –

0

Итак, вы хотите, чтобы имя сети, в которой имя домена в следующей строке содержит «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.

+0

Привет. Я только что вставил это в машину solaris. это не работает. Слишком много {'- ошибка, которую я получаю.:( – Raj

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

Злоупотребление кошачьими? И все это можно сделать с помощью одной команды «sed». –

+0

Он хотел знать, как написать команду, которую он уже работал на одной линии. Я показал ему, где разместить точку с запятой – jkramer

+0

Ниже приведена ошибка, которую я получаю. sed: command garbled:/NetworkName/{N; /\n.*ims3/ p} – Raj

0

Предполагая, что вы хотите, сетевое имя для домена ims3, это командной строки работает без СЭД:

grep -B 1 ims3 File | head -n 1 | awk -F"=" '{print $2}' 
+0

grep -B не работает в solaris. :( – Raj

0

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

sed -n -e '/NetworkName/ {' -e 'N' -e '/\n.*ims3/ s/[^\n]*=\(.*\).*/\1/P' -e '}' File 
Смежные вопросы