Показывать строки, соответствующие шаблону и 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?
  • awk + как добавить список в файл
  • Как изменить содержимое файла в Linux?
  • Группируйте все строки на основе первого столбца, затем вычислите общее количество второго и третьего столбцов
  • Манипулировать некоторые данные с ограниченным разделением в полезный CSV
  • Что означает эта команда sed?
  • как захватить последнюю версию ядра из grub.conf
  • Вырезать файл, ограниченный числом с одной или несколькими цифрами
  • Только кошка из определенной строки X (с рисунком) в другую определенную строку Y (с рисунком)
  • команда sed для обмена символами
  • Заменить соответствия многострочной строкой с помощью sed
  • Interesting Posts

    Установка библиотек разработчиков для Fedora 19 без подключения к Интернету

    В соответствии с тем, что GNOME очищает мусор «через 30 дней»?

    события аудита linux не перешли на go-аудит

    Уменьшить длину определенного столбца в текстовом файле с разделителями

    сохраняйте псевдонимы, когда я использую sudo bash

    Как использовать переменную вместо файла для вывода этой команды wc

    Как запустить приложение GUI с выскочкой?

    Мини-роутер Open WRT: установка мобильного модема

    Где я могу найти список кодов ошибок «make»?

    Проблема с подключением к сети – сервер Debian 6

    Как перенести учетную запись пользователя Linux в Active Directory, сохраняя все пользовательские настройки

    SFTP, создающий новый каталог

    Как заставить порты pulseaudio быть доступными

    Что такое распределение памяти по умолчанию для процесса оболочки linux

    Как удалить каталог с дефис в имени, пожалуйста?

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