поиск двух разных слов в последовательных строках и вывод только двух последовательных строк - PullRequest
0 голосов
/ 26 июня 2018

У меня есть файл, который содержит разные строки. Я хочу найти два слова "ОК" и " «12.2.1.1.6.180125.1» и выведите обе строки. На самом деле 1-я строка - это имя хоста, а вторая - версия, поэтому это должно быть вместе. Посоветуйте, пожалуйста, как найти с помощью python или shell?

 ` cat file 

 microcldx0093.abc.com        : OK
{:output=>"12.2.1.1.6.180125.1", :exitcode=>0}

microcldx0094.abc.com        : OK
{:output=>"12.2.1.1.6.180125.1", :exitcode=>0}

microcldx0031.abc.com        : OK
{:output=>"12.2.1.1.6.180125.1", :exitcode=>0}

microcldx0032.abc.com        : OK
{:output=>"12.2.1.1.6.180125.1", :exitcode=>0}

microcldx0142.abc.com        : OK
{:output=>"12.1.2.3.4.170111", :exitcode=>0}

microcldx0157.abc.com        : OK
{:output=>"12.1.2.3.4.170111", :exitcode=>0}

microcldx0131.abc.com        : OK
{:output=>"12.1.2.3.4.170111", :exitcode=>0}

microcldx0136.abc.com        : OK
{:output=>"12.1.2.3.4.170111", :exitcode=>0}

`

 ` cat /tmp/1 |grep -e OK -e 12.2.1.1.6.180125.1
   microcldx0093.abc.com        : OK
{:output=>"12.2.1.1.6.180125.1", :exitcode=>0}
microcldx0094.abc.com        : OK
{:output=>"12.2.1.1.6.180125.1", :exitcode=>0}
microcldx0031.abc.com        : OK
{:output=>"12.2.1.1.6.180125.1", :exitcode=>0}
microcldx0032.abc.com        : OK
{:output=>"12.2.1.1.6.180125.1", :exitcode=>0}
microcldx0142.abc.com        : OK
microcldx0157.abc.com        : OK
microcldx0131.abc.com        : OK
microcldx0136.abc.com        : OK
 `

Ответы [ 2 ]

0 голосов
/ 26 июня 2018

Вы можете попробовать: файл $ cat | grep -A1 ОК | grep -B1 '12 .2.1.1.6.180125.1 '

"grep -A1" дает каждую строку, содержащую "OK" плюс одну строку после, в пределах этих результатов "grep -B1" дает строки, содержащие "12.2.1.1.6.180125.1" плюс строку перед, что должно давать пару линий, которые вы ищете.

$ cat file | grep -A1 OK | grep -B1 '12.2.1.1.6.180125.1'
 microcldx0093.abc.com        : OK
{:output=>"12.2.1.1.6.180125.1", :exitcode=>0}
--
microcldx0094.abc.com        : OK
{:output=>"12.2.1.1.6.180125.1", :exitcode=>0}
--
microcldx0031.abc.com        : OK
{:output=>"12.2.1.1.6.180125.1", :exitcode=>0}
--
microcldx0032.abc.com        : OK
{:output=>"12.2.1.1.6.180125.1", :exitcode=>0}
0 голосов
/ 26 июня 2018

Использование AWK

awk 'BEGIN {
    found = 0
}

/OK/ {
    okLine = $0;
    found = 1;
}

/12\.2\.1\.1\.6\.180125\.1/ {
    if (found = 1) {
        print okLine "\n"  $0
    } 
   found = 0
}

{
    found = 0
}' /tmp/1

BEGIN - это шаблон, который сопоставляется перед прочтением любого ввода. Это просто устанавливает найденный флаг на ноль.

Шаблон / OK / соответствует первой строке, которую вы ищете. Это кэширует строку и устанавливает найденный флаг на 1

Следующий шаблон соответствует вашим номерам. Он должен избегать точек, поскольку они являются метасимволами. Unescaped, они будут соответствовать любому персонажу. Если найденный флаг равен 1, тогда предыдущая строка должна соответствовать ОК. Таким образом, мы выводим обе строки. Теперь мы сбрасываем флаг, чтобы ничего не печаталось до тех пор, пока мы сначала не сопоставим OK.

Последняя часть будет соответствовать всему, что не было проверено предыдущей проверкой. Это сбрасывает флаг, поэтому мы должны снова начать поиск OK.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...