2016-07-07 3 views
3

Используя grep, вы можете печатать строки, соответствующие вашему поисковому запросу. Добавление -C варианта будет печатать две строки окружающего контекста, например:Используйте grep для печати только контекста

> grep -C 2 'lorem' 
some context 
some other context 
**lorem ipsum** 
another line 
yet another line 

Кроме того, вы можете использовать grep -B 2 или grep -A 2 напечатать соответствующие линии с двумя предыдущими или следующими двумя линиями, соответственно, к примеру:

> grep -A 2 'lorem' 
**lorem ipsum** 
another line 
yet another line 

Можно ли пропустить соответствующую строку и распечатать только контекст? В частности, я хотел бы только напечатать строку, которая находится ровно 2 линии выше матча, как это:

> <some magic command> 
some context 
+0

Не в 'grep', о котором я знаю. Используйте 'awk', как в этом: [печать с sed или awk строка, соответствующая шаблону соответствия) (http://stackoverflow.com/a/17914105/1983854) – fedorqui

+0

@fedorqui это работает для следующих строк, но могу ли я изменить чтобы получить предыдущие строки? никогда не использовал awk раньше. – rrrafalsz

+1

Используйте 'tac', чтобы распечатать файл назад. – fedorqui

ответ

3

Если вы можете позволить пару grep экземпляров, которые будут использоваться, вы можете попробовать, как, как я уже говорил в комментарии.

$ grep -v "lorem" < <(grep -A2 "lorem" file) 
another line 
yet another line 

$ grep -A2 "lorem" file | grep -v "lorem" 
another line 
yet another line 

Если вы заинтересованы в дозе awk, есть хороший способ сделать это как

$ awk -v count=2 '{a[++i]=$0;}/lorem/{for(j=NR-count;j<NR;j++)print a[j];}' file 
another line 
yet another line 

Он работает, сохраняя весь файл в собственном массиве и после поиска по шаблону lorem, специальная переменная awk, которая хранит номер строки (NR), указывает на точную строку, в которой находится шаблон. Если мы зацикливаем на 2 строки перед ним, как это определено переменной awk-v count, мы можем распечатать необходимые строки.

Если вы заинтересованы в распечатке рисунка, просто измените условие в петле как j<=NR вместо j<NR. Это оно!

0

Невозможно сделать это только с помощью команды grep. Если в тексте есть только один экземпляр lorem, вы можете выполнить вывод через head.

grep -B2 lorem t | head -1 

Если может быть несколько возникновение lorem, вы могли бы использовать awk:

awk '{second_previous=previous; previous=current_line; current_line=$0}; /lorem/ { print second_previous; }' 

Эта команда AWK сохраняет каждую строку (вместе с предыдущим и один до этого) в переменных так, когда его встречает строку, содержащую lorem, она печатает вторую последнюю строку. Если lorem происходит в первой или второй строке ввода, ничего не печатается.

Смежные вопросы