Як я отримую рядки до / після того, як греп призводить до удару?


151

Привіт, я дуже новачок у програмі баш. Я хочу спосіб пошуку в заданому тексті. Для цього я використовую 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
sriram

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

Звичайний греп

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

Обріжте точні відповідні лінії та 2 рядки після

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

Обріжте точні відповідні лінії та 2 рядки раніше

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

Обріжте точні відповідні лінії та 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.

3
Добре, я повинен був переглянути це кілька разів, можливо, я можу це запам'ятати як -A (FTER) -B (EFORE) -C (ONTEXT)
відкрито

11

Спосіб зробити це у верхній частині сторінки man

grep -i -A 10 'error data'

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.