awk sep извлекает строки данных после определенной переменной

У меня есть большой файл с регулярным шаблоном

       snaps1:          Counter:             4966
        Opens:          Counter:           357283

     Instance:     s.1.aps.userDatabase.mount275668.attributes


       snaps1:          Counter:             0
        Opens:          Counter:           357283

     Instance:     s.1.aps.userDatabase.test.attributes

Эти строки повторяются среди других строк выше и ниже. Мне нужно напечатать строку snap1, а также получить строку instance: Итак, мне нужно найти snap1, но только если счетчик больше 0, а затем напечатать строку snap1, а также строку экземпляра.

Извините, не подскажите, как это сделать? Вы можете помочь?

Итак, из строк выше я должен увидеть этот вывод

snaps1:          Counter:             4966
Instance:        s.1.aps.userDatabase.mount275668.attributes

Цените любую помощь, которую вы можете предоставить


person theuniverseisflat    schedule 23.11.2015    source источник
comment
Спасибо и вам за подробное объяснение   -  person theuniverseisflat    schedule 24.11.2015


Ответы (2)


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

awk '/snaps1/ && $NF>0{print;f=1}f&&/Instance/{print;f=0}' file

Чтобы избежать пробелов в начале строки:

awk '/snaps1/ && $NF>0{gsub(/^ */,"");print;f=1}
     f&&/Instance/    {gsub(/^ */,"");print;f=0}'  file

Результаты

snaps1:          Counter:             4966
Instance:     s.1.aps.userDatabase.mount275668.attributes

Пояснение

/snaps1/ && $NF>0 {gsub(/^ */,"");print;f=1} используется для установки f флага, когда найден шаблон snaps1 и последнее поле NF должно быть больше единицы, а также удаляет ненужные пробелы и печатает текущую строку.

ПРИМЕЧАНИЕ /snaps1/ && $NF это эквивалентное выражение, причина: любое числовое значение, кроме нуля, истинно для awk.

f&&/Instance/ {gsub(/^ */,"");print;f=0}, если флаг f равен True (1) и найден шаблон Instance, вывести текущую строку (удалив ненужные пробелы) и снова установить флаг в значение false.

person Juan Diego Godoy Robles    schedule 23.11.2015
comment
Привет и спасибо, я попробовал вашу команду, но получил синтаксическую ошибку? awk '/snaps1/{s=$0; c=$NF} /Instance/ && c{print s ORS $0}' adsmobout.21.37.59 awk: синтаксическая ошибка возле строки 1 awk: спасение возле строки 1 - person theuniverseisflat; 23.11.2015
comment
Извините за поздний / задержку ответа - Ваша команда также работает. Извините, я пытаюсь понять, как это работает.... - person theuniverseisflat; 02.12.2015

person    schedule
comment
Привет, я тоже пробовал вашу команду - все еще получаю awk: синтаксическая ошибка возле строки 1 awk: спасение возле строки 1 Я также пробовал cat файл и команду ту же ошибку - person theuniverseisflat; 23.11.2015
comment
Это сообщение об ошибке только исходит от старого сломанного awk, который, к сожалению, является awk по умолчанию в Solaris. Если вы используете Solaris, используйте /usr/xpg4/bin/awk (или менее функциональный и не-POSIX, но nawk также работает нормально для большинства задач). Во всех системах пытайтесь получить/использовать GNU awk, если это возможно. - person Ed Morton; 23.11.2015
comment
Привет, спасибо за быстрый ответ - я попробовал /usr/xpg4/bin/awk, и я запустил его для своего файла, и никакого результата не было. Я знаю, что есть строки с этим - person theuniverseisflat; 23.11.2015