у меня есть файл журнала от 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