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

52

Привет, я очень новичок в программировании 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

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

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

4 ответа

115
Лучший ответ

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

grep -i -B 10 'error' data

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

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

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

grep -i -A 10 'error data'
5

Попробуйте следующее:

grep -i -A 10 "my_regex"

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

2

Это отображает 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 и две строки перед

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:~$ 

Ссылка: manpage 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.
  • 2
    Хорошо, я должен был посмотреть это несколько раз сейчас, может быть, я могу вспомнить это как -A (FTER) -B (EFORE) -C (ONTEXT)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню