Назад | Перейти на главную страницу

удалить 2 строки из вывода, grep соответствует регулярному выражению плюс следующая 1

у меня есть файл журнала от postgresql, в котором есть записи журнала этого формата;

LOG:  execute <unnamed>: /match this here/
DETAIL:  parameters: /also want to filter this line/

Я думал, что это возможно с

grep -v --after-context=1 'match this here' /my/log/file.log

но это не работает. есть ли какая-то магия sed / awk / grep, или мне нужно сделать немного perl?

Насколько я знаю, с помощью одной только команды grep этого не сделать.
awk может сделать это довольно просто:

awk -v skip=-1 '/match this here/ { skip = 1 } skip-- >= 0 {next } 1' /my/log/file.log

редактировать:
Я предположил, что вы не можете сопоставить вторую строку никаким регулярным выражением, и вы действительно хотите сопоставить строку, содержащую X, и строку после нее. Если вы можете сопоставить строку, это будет намного проще:

egrep -v "match this here|also want to filter this line" /my/log/file.log

Другой способ использования awk:

awk '/match this here/ {getline; next} {print}' file.log

Вы собираетесь использовать "-v", чтобы первая строка не отображалась в строке "match this here"? «-v» инвертирует ваше выражение, чтобы сказать «отображать строки, которые не соответствуют 'match this here'». Я сейчас не в поле * nix, но я думаю, что вы могли бы сделать что-то вроде этого, если бы вы хотели, чтобы отображалась только вторая строка:

grep --after-context=1 'match this here' /my/log/file.log | grep -v '^LOG:' | grep -v '^-'

Это должно напечатать обе строки, но второй оператор grep должен скрыть первую строку, которая начинается с LOG:

Попробуй и удачи.

Не совсем понятно, чего вы хотите добиться. Если вы хотите / сопоставить это здесь /, а затем распечатать следующую строку, тогда

sed -n '/match this here/{n;p}' /my/log/file.log

DETAIL:  parameters: also want to filter this line

Если вы хотите / сопоставить это здесь /, а затем распечатать сопоставленную строку и следующую за ней, тогда

sed -n '/: match this here/{p;n;p}' /my/log/file.log

LOG:  execute <unnamed>: match this here
DETAIL:  parameters: also want to filter this line

С помощью grep вы можете

grep -A 1 'match this here' /my/log/file.log 

LOG:  execute <unnamed>: match this here
DETAIL:  parameters: also want to filter this line

если у вас есть несколько совпадений, каждое из них разделено --

grep -A 1 'match this here' /my/log/file.log
LOG:  execute <unnamed>: match this here
DETAIL:  parameters: also want to filter this line
--
LOG:  execute <unnamed>: match this here
DETAIL:  parameters: also want to filter this line

И ты можешь

grep -A 1 'match this here' /my/log/file.log | grep -v 'match this here'

чтобы удалить первую строку, если вы этого хотите.

ЖУРНАЛ: выполнить: / сопоставить здесь / ДЕТАЛИ: параметры: / также хочу отфильтровать эту строку /

STR = 'сопоставить здесь' FILE = / var / log / logfile.log

sed "/ $ STR / {n; d;}" $ FILE | sed / $ STR / d