Подтвердить что ты не робот

Как я могу сделать "grep" показать одну строку на пять строк выше строки grepped?

Я видел несколько примеров строк grepping до и после, но я хотел бы игнорировать средние строки. Итак, я бы хотел, чтобы строки были пять строк, но ничего больше. Это можно сделать?

4b9b3361

Ответ 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-ю строку.