2015-09-30 3 views
0

Я пытаюсь grep блоки из базы данных с шаблоном.
После этого я хочу снова вырвать из каждого блока какой-то узор.
Но мне нужно только одно совпадение для каждого шаблона каждого блока.

файл выглядит так:Grep/Sed/Awk блок и поиск шаблона

inetnum:  *.*.*.* - *.*.*.* 
netname:  Ch-123 
descr:   companyname 
descr:   address 1 
descr:   address 2 
descr:   address 3 
country:  FR 
admin-c:  DUMY 
tech-c:   DUMY 
status:   DUMY 
mnt-by:   mnt 
changed:  [email protected] 
created:  1970-01-01T00:00:00Z 
last-modified: 1970-01-01T00:00:00Z 
source:   RIPE 
remarks:  **************************** 
remarks:  **************************** 
remarks:  **************************** 
remarks:  **************************** 
remarks:  **************************** 
remarks:  **************************** 

% Tags relating to '*.*.*.* - *.*.*.*' 
% RIPE-REGISTRY-RESOURCE 

inetnum:  *.*.*.* - *.*.*.* 
netname:  Ch-123 
descr:   companyname 
descr:   address 1 
descr:   address 2 
descr:   address 3 
country:  FR 
admin-c:  DUMY 
tech-c:   DUMY 
status:   DUMY 
mnt-by:   mnt 
changed:  [email protected] 
created:  1970-01-01T00:00:00Z 
last-modified: 1970-01-01T00:00:00Z 
source:   RIPE 
remarks:  **************************** 
remarks:  **************************** 
remarks:  **************************** 
remarks:  **************************** 
remarks:  **************************** 
remarks:  **************************** 

% Tags relating to '*.*.*.* - *.*.*.*' 
% RIPE-REGISTRY-RESOURCE 

Так что я должен получить каждый блок, где "страна: CH" есть. После этого мне нужно, например, для каждого блока только ОДНО РЕЗУЛЬТАТ, как только ОДИН 'descr', ONE 'netname', даже больше, мне нужно первое для имени компании.

Требование:

  1. Получить блоки файла, которые имеют "страна: CH"
  2. Затем Grep/AWK/СЭД независимо только один из этой "inetnum, сетевое_имя, Descr"

Вывод должен выглядеть так, чтобы каждый блок, где «страна: CH».

*.*.*.* - *.*.*.* 
Ch-123 
companyname 

И НЕ:

Вход:

grep -E "inetnum:  (.*)\n|netname:  (.*)\|descr:   (.*)\n" file 

Выход:

*.*.*.* - *.*.*.* 
Ch-123 
companyname 
address 1 
address 2 
address 3 

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

Я надеюсь, что кто-то может мне помочь.

И: Почему: sed -n '/inetnum/!b;:a;/% Tags relating to/!{$!{N;ba}};{/country: ch/p}' file никогда не заканчивается?

+4

пожалуйста, опубликовать образец данных и некоторые примеры желаемого (и нежелательные) матчей. –

+0

Разве это так лучше? – tokyodrift1993

+0

Не совсем. Вам нужно показать FEW блок ввода и показать вывод, который вы хотите, независимо от вашего поиска: один блок со всеми полями? Несколько блоков с подмножеством полей? Подмножество полей по всем блокам? Что-то другое? Держите его простым, ясным, точным и проверяемым (то есть с чем-то, с чем мы можем выполнить потенциальное решение). И не показывайте «decr1» и т. Д., А затем попытайтесь описать его в комментариях внизу - покажите некоторые фактические значения в примере, например, которые могут отображаться в ваших реальных данных. –

ответ

0

awk на помощь!

Если структура является фиксированной и блоки отделены друг от друга пустой строкой это должно работать

awk -F: -vRS= -vOFS=, '$16~/IT|DE/{print $2,$4,$6}' 
+0

Не работает для меня, а не выходит. Mabye нужен лучший способ grep Блок. – tokyodrift1993

Смежные вопросы