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

Например, из этого файла:

CREATE SYNONYM I801XS07 FOR I8010.I801XT07 * ERROR at line 1: ORA-00955: name is already used by an existing object CREATE SYNONYM I801XS07 FOR I8010.I801XT07 * ERROR at line 1: ORA-00955: name is already used by an existing object Table altered. Table altered. Table altered. Table altered. Table altered. Table altered. Table altered. Table altered. DROP INDEX I8011I01 * ERROR at line 1: ORA-01418: specified index does not exist Index created. 

Я хочу найти ORA- и показать ORA- линию и предыдущие 4 строки:

 CREATE SYNONYM I801XS07 FOR I8010.I801XT07 * ERROR at line 1: ORA-00955: name is already used by an existing object CREATE SYNONYM I801XS07 FOR I8010.I801XT07 * ERROR at line 1: ORA-00955: name is already used by an existing object DROP INDEX I8011I01 * ERROR at line 1: ORA-01418: specified index does not exist 

3 Solutions collect form web for “Показывать строки, соответствующие шаблону и 4 строки перед каждым”

Предположим, что вы находитесь в пожилой системе, такой как HP-UX, у которой нет утилит GNU, а только старый, оригинальный BSD или AT & T «grep». Вы могли бы сделать что-то вроде этого:

 #!/bin/sh awk '/ORA-/ { print line1; print line2; print line3; print line4; print $0 }\ // {line1 = line2; line2 = line3; line3 = line4; line4 = $0}' $1 

Да, есть тонны краевых условий, это не получается правильно, но зачем я тщетно? Кроме того, учитывая, что вы работаете над некоторыми дешифрованными устаревшими ОС и аппаратными средствами, у вас, вероятно, нет процессорной мощности для безупречной обработки ошибок.

Опция -B для grep делает именно это: grep -B 4 ORA- your_file .

В отсутствие GNU grep я адаптировал пример grep4 из учебника grymoire sed :

 #!/bin/sh # grepB4: prints out 4 lines before and the line including pattern # if there is only one argument, exit case $# in 1);; *) echo "Usage: $0 pattern";exit;; esac; sed -n ' '/"$1"/' !{ # does not match - add this line to the hold space H # bring it back into the pattern space x # Two lines would look like .*\n.* # Three lines look like .*\n.*\n.* # Delete extra lines - keep four s/^.*\n\(.*\n.*\n.*\n.*\)$/\1/ # put it back in hold space x } '/"$1"/' { # matches - append the current line H # bring hold space contents into pattern space g # print the 4 lines p # add the mark a\ --- }' 

Использование: grepB4 pattern < file .

Ответ Брюса Эдигера в основном похож на awk , который часто имеет менее критический синтаксис, чем sed .

 awk 'NR == FNR && $0 ~ p { for (i = FNR; i >= FNR - l; i--) nr[i]; next } FNR in nr BEGIN { ARGV[ARGC++] = ARGV[ARGC - 1] }' l=4 p=ORA- infile 

В Solaris используйте nawk или / usr / xpg4 / bin / awk .

  • Заменить первое появление шаблона в файле, который может содержать косую черту
  • Замените все, кроме прописных букв, первым параметром (с sed)
  • заменить сложную текстовую строку в нескольких файлах, содержащих специальные символы
  • Заменить первый столбец файла с помощью вывода команды
  • Подсчитайте вхождения строки в файл
  • Захват в переменных оболочки аргументов после команды (между скобками)
  • Почему sed действует по-разному в зависимости от выходного файла?
  • Как использовать переменные в команде sed
  • Как заменить символ во всех файлах .php внутри папки на OS X?
  • Проблема с sed в массиве, содержащем строки, содержащие пробелы
  • Удалить символ из столбца CSV
  • Interesting Posts

    проклятая программа для элемента выбора из списка

    iconv (для использования с rsync), чтобы избежать недопустимых имен файлов Windows в локальном разделе NTFS

    Как я могу перечислить каждый файл в каталоге, кроме тех, у которых указаны указанные расширения?

    Значение записей в файле / etc / securetty?

    Может ли rpm обрабатывать установку другой ОС в другой логический том?

    Нумерация строк в Vim

    Можно ли сканировать веб-сайт для повторных изображений?

    Как я могу заказать вывод команды «эхо»

    блокировка всех, кроме определенных ips, определенных сервисов в CentOS 7

    Невозможно сравнить строки

    Различия между виртуальными интерфейсами Atheros (ath0 и т. Д.) И несколькими физическими

    Разделить файл на несколько файлов на основе шаблона

    ALSA: Zoom H4n не работает в качестве источника звука USB на ПК

    Управление USB-соединением / питание – только зарядка

    Форматировать пакеты по вертикали в pacman

    Linux и Unix - лучшая ОС в мире.