Làm cách nào để tìm nạp các dòng trước / sau kết quả grep trong bash?


151

Xin chào, tôi rất mới với lập trình bash. Tôi muốn một cách để tìm kiếm trong một Văn bản nhất định. Cho rằng tôi sử dụng grepchức năng:

grep -i "my_regex"

Điều đó làm việc. Nhưng được đưa ra datanhư thế này:

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

Khi tôi tìm thấy từ error(sử dụng grep -i error data), tôi muốn tìm 10 dòng theo sau từ đó error. Vì vậy, đầu ra của tôi nên là:

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

Có cách nào để làm điều đó?


Từ mô tả của bạn, có vẻ như bạn muốn 10 dòng tiếp tục từ error.
ThomasW

Điều này có trả lời câu hỏi của bạn không? grep một tập tin, nhưng hiển thị một số dòng xung quanh?
Ủng hộ hữu cơ

Câu trả lời:


266

Bạn có thể sử dụng -B-Ađể in các dòng trước và sau trận đấu.

grep -i -B 10 'error' data

Sẽ in 10 dòng trước trận đấu, bao gồm cả chính dòng phù hợp.


1
Cảm ơn điều này đang làm việc. Nhưng khi tôi cố lưu trữ thực thi này trong biến như thế này test=$(grep -i -B 10 'error' data)và in nó bằng cách sử dụng echo $test, tôi nhận được các đường thẳng dài làm đầu ra.
sriram

1
Cảm ơn tôi đã tìm ra tôi cần phải làm như thế này echo "$test"hơn làecho $test
sriram

25
-C 10sẽ in ra 10 dòng trước VÀ sau một cú trượt!
Joshua Pinter

Có cách nào để làm điều này bằng cách sử dụng một điểm cụ thể trước điểm? Nói chiều dài tôi phải lấy trước là biến?
Erudaki

31

Điều này in 10 dòng bối cảnh sau khi phù hợp với dòng

grep -i "my_regex" -A 10

Nếu bạn cần in 10 dòng ngữ cảnh hàng đầu trước khi khớp dòng,

grep -i "my_regex" -B 10

Và nếu bạn cần in 10 dòng bối cảnh đầu ra hàng đầu và dấu.

grep -i "my_regex" -C 10

Thí dụ

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 bình thường

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

Grep khớp dòng chính xác và 2 dòng sau

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

Grep kết hợp chính xác các dòng và 2 dòng trước

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

Grep khớp chính xác các dòng và 2 dòng trước và sau

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

Tham khảo: trang web 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
Thật tuyệt, tôi đã phải tìm kiếm điều này một vài lần bây giờ, có lẽ tôi có thể nhớ nó là -A (FTER) -B (EFORE) -C (ONTEXT)
Đã mở

11

Cách để làm điều này là gần đầu trang của người đàn ông

grep -i -A 10 'error data'

8

Thử cái này:

grep -i -A 10 "my_regex"

-Một phương tiện 10, in mười dòng sau khi khớp với "my_regex"

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.