Я видел несколько примеров строк grepping до и после, но я хотел бы игнорировать средние строки. Итак, я бы хотел, чтобы строки были пять строк, но ничего больше. Это можно сделать?
Как я могу сделать "grep" показать одну строку на пять строк выше строки grepped?
Ответ 1
Хорошо, я думаю, что это сделает то, что вы ищете. Он будет искать шаблон и извлекать 5-ю строку перед каждым соответствием.
grep -B5 "pattern" filename | awk -F '\n' 'ln ~ /^$/ { ln = "matched"; print $1 } $1 ~ /^--$/ { ln = "" }'
в основном, как это работает, он берет первую строку, печатает ее, а затем ждет, пока не увидит ^--$
(разделитель совпадений, используемый grep), и начнется снова.
Ответ 2
Это опция -B
-B NUM, --before-context=NUM Print NUM lines of leading context before matching lines. Places a line containing -- between contiguous groups of matches.
Ответ 3
Если вы хотите иметь только 5-ю строку перед матчем, вы можете сделать это:
grep -B 5 pattern file | head -1
Edit:
Если вы можете иметь более одного совпадения, вы можете попробовать это (обмен pattern
с вашим фактическим рисунком):
sed -n '/pattern/!{H;x;s/^.*\n\(.*\n.*\n.*\n.*\n.*\)$/\1/;x};/pattern/{x;s/^\([^\n]*\).*$/\1/;p}' file
Я взял это из Sed tutorial, раздел: Сохранение большего количества одна строка в буфере удержания, пример 2 и немного адаптирована.
Ответ 4
Этот способ мне проще:
grep --no-group-separator -B5 "pattern" file | sed -n 1~5p
Это grep 5 строк до и включая шаблон, отключает разделитель группы, затем печатает каждую 5-ю строку.