2017-01-17 4 views
1

У меня есть текстовый файл с большим количеством информации. Мне интересно получать только псевдонимы. Все псевдонимы и информация о портах разделяются пробелом, каждый порт разделяется точкой с запятой.grep строка и строка после одной строки

Эта команда ..

cat ~/Desktop/brocade_output.txt |grep -A1 alias 

дает мне этот выход. Все псевдонимы начинаются с префикса a_.

> alias: a_computer_1  
     40:01:00:00:ab:00:00:aj; 60:01:00:0e:1e:d0:b5:fd 
-- 
alias: a_helpdesk 
     41:00:00:24:fh:5c:99:9e; 81:00:00:24:ff:5c:48:9f 
-- 
alias: a_library 
     91:00:00:24:fh:5c:99:9g; 91:00:00:24:ff:5c:48:9g 
-- 

Желаемая выход

a_computer_1 40:01:00:00:ab:00:00:aj 60:01:00:0e:1e:d0:b5:fd 
a_helpdesk 41:00:00:24:fh:5c:99:9e 81:00:00:24:ff:5c:48:9f 
a_library 91:00:00:24:fh:5c:99:9g 91:00:00:24:ff:5c:48:9g 
+0

Это в основном то, что в разделе «Output». Просто гораздо больший файл. – nyitguy

+0

Звучит как работа для 'sed' или' awk'. –

+0

Если вы печатаете контекстные строки, grep всегда будет вводить разделитель при печати контекстных строк. Хотя вы можете подавить разделитель, grep не переформатирует контент. Я согласен с Безумным Физиком. Это лучше сделать с помощью sed, awk или даже perl. – JamieSee

ответ

4

В AWK:

$ awk '/alias/ {f=$2;next} f{$1=$1; print f, $0; f=0 }' file 
a_computer_1 40:01:00:00:ab:00:00:aj; 60:01:00:0e:1e:d0:b5:fd 
a_helpdesk 41:00:00:24:fh:5c:99:9e; 81:00:00:24:ff:5c:48:9f 
a_library 91:00:00:24:fh:5c:99:9g; 91:00:00:24:ff:5c:48:9g 

Разъяснение:

  • /alias/ {f=$2;next} когда alias в записи, f равно второе поле
  • f{$1=$1; print f, $0; f=0 } когда f набор, распечатайте его и "Следующая запись"
+0

Теперь мы готовим с газом. У меня есть точка с запятой, но я могу найти другой способ удалить его. – nyitguy

+1

'++' для вас знаете почему! – Inian

+0

О, была точка с запятой, пропустила ее. Добавьте 'sub (/; /," ")' перед '$ 1 = $ 1'. –

0

С СЕПГ:

sed -n '/alias:/N;{s/.*\(a_[^ ]* \)[[:space:]]*\(.*\)/\1\2/p;}' file 

Добавить -i флаг редактировать файл на месте.

+0

Извините, что не сработал, я также обновил вопрос, чтобы предоставить немного больше информации. "sed: 1:" /alias:/N;{s/.*\(a_comp ... ": bad flag в команде подстановки: '}'" – nyitguy

+0

Может быть, отсутствует ';' после команды 'p'. I отредактированный – SLePort

0

Попробуйте это:

grep -A1 alias ~/Desktop/brocade_output.txt | cut -f2- -d":" 

Я понимаю, вы хотите, чтобы часть линии, которая следует за первым :, поэтому использование : в качестве разделителя для cut и принимать все поля, начиная с 2 следует сделать трюк.

+0

Это дает тот же результат, что и исходная команда. – nyitguy

+0

Извините, я сначала разместил с «-f1-» вместо «-f2», это была опечатка – Fred

0

Это может быть сделано в Perl с несколькими более символов: используются

perl -ane 'if (/alias/){$_=<>; s/^\s*//; print "$F[1] $_"}' file 

Эти параметры командной строки:
- -n петлю вокруг каждой строки входного файла
- -a режим AutoSplit - разделение входного строки в массив @F
- -e выполнить код PERL

/alias/ соответствует текущей строке
$F[1] является второй элемент в @F
$_=<> присваивает переменной по умолчанию $_ на следующую строку из входного файла
s/^\s*// удаляет начальные пробелы из $_

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