Как мне получить строки до / после результата grep в bash?


151

Привет, я очень новичок в программировании Bash. Я хочу способ поиска в данном тексте. Для этого я использую grepфункцию:

grep -i "my_regex"

Это работает. Но, учитывая, dataкак это:

This is the test data
This is the error data as follows
. . . 
. . . .
. . . . . . 
. . . . . . . . .
Error data ends

Как только я нашел слово error(используя grep -i error data), я хочу найти 10 строк, следующих за словом error. Итак, мой вывод должен быть:

    . . . 
    . . . .
    . . . . . . 
    . . . . . . . . .
    Error data ends

Есть ли способы сделать это?


Из вашего описания кажется, что вы хотите 10 строк, следующих за словом error.
ThomasW

Ответы:


266

Вы можете использовать -Bи -Aдля печати строк до и после матча.

grep -i -B 10 'error' data

Напечатает 10 строк до начала матча, включая саму строку соответствия.


1
Спасибо, это работает. Но когда я попытался сохранить это выполнение в переменной, как эта test=$(grep -i -B 10 'error' data), и распечатать его, используя echo $test, я получаю прямые длинные строки в качестве вывода.
Шрирам

1
Спасибо, я понял, что мне нужно делать это, echo "$test"а неecho $test
Шрирам

25
-C 10распечатает 10 строк до и после одним махом!
Джошуа Пинтер

Есть ли способ сделать это, используя конкретную точку перед? скажем, длина, которую я должен захватить, является переменной?
Эрудаки

31

Это печатает 10 строк конечного контекста после сопоставления строк

grep -i "my_regex" -A 10

Если вам нужно напечатать 10 строк переднего контекста перед соответствием строк,

grep -i "my_regex" -B 10

А если вам нужно вывести 10 строк начального и конечного выходного контекста.

grep -i "my_regex" -C 10

пример

user@box:~$ cat out 
line 1
line 2
line 3
line 4
line 5 my_regex
line 6
line 7
line 8
line 9
user@box:~$

Нормальный grep

user@box:~$ grep my_regex out 
line 5 my_regex
user@box:~$ 

Grep точное совпадение строк и 2 строки после

user@box:~$ grep -A 2 my_regex out   
line 5 my_regex
line 6
line 7
user@box:~$ 

Grep точное соответствие строк и 2 строки перед

user@box:~$ grep -B 2 my_regex out  
line 3
line 4
line 5 my_regex
user@box:~$ 

Grep точное соответствие строк и 2 строки до и после

user@box:~$ grep -C 2 my_regex out  
line 3
line 4
line 5 my_regex
line 6
line 7
user@box:~$ 

Ссылка: manp grep

-A num
--after-context=num

    Print num lines of trailing context after matching lines.
-B num
--before-context=num

    Print num lines of leading context before matching lines.
-C num
-num
--context=num

    Print num lines of leading and trailing output context.

3
Хорошо, я должен был посмотреть это несколько раз сейчас, может быть, я могу вспомнить это как -A (FTER) -B (EFORE) -C (ONTEXT)
Открыт

11

Способ сделать это в верхней части справочной страницы

grep -i -A 10 'error data'

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.