Как мне получить строки до / после результата 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

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

Sriram
источник
Из вашего описания кажется, что вы хотите 10 строк, следующих за словом error.
ThomasW
Отвечает ли это на ваш вопрос? grep файл, но показать несколько окружающих строк?
Органический адвокат

Ответы:

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'
Рэй Тоал
источник
8

Попробуй это:

grep -i -A 10 "my_regex"

-A 10 означает, вывести десять строк после совпадения в «my_regex»

Десислав Каменов
источник