grep một tập tin, nhưng hiển thị một số dòng xung quanh?


3419

Tôi muốn grepcho một chuỗi, nhưng cũng hiển thị năm dòng trước và năm dòng sau cũng như dòng phù hợp. Làm thế nào tôi có thể làm điều này?


3
Tôi giữ một bản sao kịch bản perl của Brendan Gregg cho mục đích này. Hoạt động tốt.
Ethan Post

6
Để biết giải pháp hoạt động trên Solaris, hãy xem liên kết này .
jahroy

106
man grep | grep -C 1 context:)
StvnW

20
man grep | grep -C 1 "\-C";)
Anders B

9
@StvnW ... Tôi không biết nên gọi meta đó (trong một bối cảnh tổng quát hơn, thay vì SO), hay gọi nó là gì. Bạn đã trả lời câu hỏi bằng cách chỉ ra cách sử dụng câu trả lời để tìm câu trả lời.
bballdave025

Câu trả lời:


4538

Đối với BSD hoặc GNU, grep bạn có thể sử dụng -B numđể đặt bao nhiêu dòng trước khớp và -A numcho số lượng dòng sau khớp.

grep -B 3 -A 2 foo README.txt

Nếu bạn muốn cùng một số dòng trước và sau khi bạn có thể sử dụng -C num.

grep -C 3 foo README.txt

Điều này sẽ hiển thị 3 dòng trước và 3 dòng sau.


56
Thật tốt nhưng thật không may, Solaris grep không hỗ trợ điều đó. Xem liên kết đó cho solaris: unix.com/solaris/33533-grep-display-few-lines-b Before
after.html

9
Ok, nhưng nếu muốn hiển thị tất cả các dòng đầu ra sau trận đấu thì sao? grep -A0 và grep -A-1 đừng cắt nó ...
g33kz0r

2
không làm việc cho tôi vì một số lý do, mặc dù được đề cập trong các trang người đàn ông của tôi.
Hayri Uğur Koltuk

2
Nếu bạn là HP-UX env, không có phiên bản grep nào hoạt động như trong Solaris. Đã có thể sử dụng liên kết Solaris nhưng thay thế nawk bằng awk trong liên kết đó.
zkarthik

6
-n dành cho số dòng, nhưng đối với một số phiên bản của grep -n # sẽ hiển thị # dòng xung quanh (như -c) với số dòng. Đó là một lối tắt hữu ích mà tôi cần đến khi tôi cần bối cảnh.
Anthony DiSanti

607

-A-Bsẽ hoạt động, như ý muốn -C n(đối với ncác dòng của bối cảnh), hoặc chỉ -n(cho ncác dòng của bối cảnh ... miễn là n là 1 đến 9).


Tôi đã thử -nđịnh dạng và phát hiện ra nó chỉ hoạt động cho đến khi 9. Vì 15nó trả về 5 dòng
Deepak Mahakale

7
@DeepakMahakale Điều này có lẽ liên quan đến cách các đối số / tùy chọn dòng lệnh thường được phân tích cú pháp bởi các chương trình POSIX. Trình chỉ định tùy chọn là một ký tự đơn (chẳng hạn như -A, -Bhoặc -C). Thông thường, bộ chỉ định tùy chọn được theo sau bởi một giá trị ( -o a.outđể chỉ định tệp đầu ra trong GCC), nhưng nó cũng có thể hoạt động như một công tắc / cờ đơn giản ( -gđể bật thông tin gỡ lỗi trong GCC). Tuy nhiên, khoảng trắng giữa các tùy chọn là tùy chọn, vì vậy, đối với các tùy chọn không có giá trị, có thể hợp nhất chúng ( -ABC), có nghĩa -15là được diễn giải -1 -5(hai tùy chọn riêng biệt) và -5ghi đè lên -1.
natiiix

1
-5 nhanh hơn cả -A 5 -B 5. Những thứ đó không có nghĩa là được sử dụng cùng nhau. Nó sẽ sạch hơn đối với các trình đọc khác của tập lệnh nếu bạn chọn -A hoặc -B hoặc -C trên -9.
Eric Aldinger

76

ack hoạt động với các đối số tương tự như grep và chấp nhận -C. Nhưng nó thường tốt hơn cho việc tìm kiếm thông qua mã.


5
ack cũng hỗ trợ -A -B.
Shuo

Ack tốt hơn grep theo nhiều cách. Nó nhanh hơn với cú pháp đơn giản hơn.
chim

1
grep có lợi thế là được cài đặt mặc định trên nhiều hệ thống.
Marc Z

1
@MarcZ: Đúng, grep có nhiều khả năng được cài đặt theo mặc định hơn ack, nhưng ack là một tập lệnh độc lập, di động. Không cần phải biên dịch nó hoặc cài đặt nó trong một thư mục hệ thống như / usr / bin /. Khi nó được tải xuống và được đặt vào một thư mục được liệt kê trong $ PATH (và tập quyền bit eXecute của nó), nó sẽ hoạt động ngay lập tức. (Không có đặc quyền sudo hoặc root được yêu cầu để ack hoạt động.)
JL

Câu hỏi này là về grep, không chắc chắn sử dụng nó để "quảng cáo" ack(mà là một công cụ tuyệt vời, thực sự) là một ý tưởng tốt ...
MonsieurDart

39
grep astring myfile -A 5 -B 5

Điều đó sẽ grep "myfile" cho "làm mờ" và hiển thị 5 dòng trước và sau mỗi trận đấu


19
"grep Astring myfile -C 5" sẽ làm điều tương tự
Syed Siraj Uddin

20

Tôi thường sử dụng

grep searchstring file -C n # n for number of lines of context up and down

Nhiều công cụ như grep cũng có các tệp người đàn ông thực sự tuyệt vời. Tôi thấy mình đề cập đến trang người đàn ông của grep rất nhiều vì có rất nhiều thứ bạn có thể làm với nó.

man grep

Nhiều công cụ GNU cũng có một trang thông tin có thể có nhiều thông tin hữu ích hơn ngoài trang man.

info grep

13

Sử dụng grep

$ grep --help | grep -i context
Context control:
  -B, --before-context=NUM  print NUM lines of leading context
  -A, --after-context=NUM   print NUM lines of trailing context
  -C, --context=NUM         print NUM lines of output context
  -NUM                      same as --context=NUM

Bạn đã không đọc câu trả lời được chấp nhận? Bạn chỉ đang lặp lại những gì đã được nói trong một câu hỏi gần 10 năm tuổi ...
Yokai

7
Ôi tôi xin lỗi Yokai. Nhưng tôi không đọc bất cứ điều gì về việc gre phần trợ giúp của grep để lấy câu trả lời.
Chiel ten Brinke

1
@Yokai Bên cạnh những gì Chiel ten Brinke nói, câu trả lời được chấp nhận không đề cập đến các tùy chọn dài
user3738870

10

Tìm kiếm "17655" trong "/some/file.txt" hiển thị bối cảnh 10 dòng trước và sau (sử dụng Awk), đầu ra có số dòng theo sau là dấu hai chấm. Sử dụng tính năng này trên Solaris khi 'grep' không hỗ trợ các tùy chọn "- [ACB]".

awk '

/17655/ {
        for (i = (b + 1) % 10; i != b; i = (i + 1) % 10) {
                print before[i]
        }
        print (NR ":" ($0))
        a = 10
}

a-- > 0 {
        print (NR ":" ($0))
}

{
        before[b] = (NR ":" ($0))
        b = (b + 1) % 10
}' /some/file.txt;

7

ripgrep

Nếu bạn quan tâm đến hiệu suất, hãy sử dụng ripgrepcó cú pháp tương tự grep, ví dụ:

rg -C5 "pattern" .

-C, --context NUM- Hiển thị NUM dòng trước và sau mỗi trận đấu.

Ngoài ra còn có các tham số như -A/ --after-context-B/ --before-context.

Công cụ này được xây dựng dựa trên công cụ regex của Rust , giúp nó hoạt động rất hiệu quả trên dữ liệu lớn.


5

Đây là giải pháp @Ygor trongawk

awk 'c-->0;$0~s{if(b)for(c=b+1;c>1;c--)print r[(NR-c+1)%b];print;c=a}b{r[NR%b]=$0}' b=3 a=3 s="pattern" myfile

Lưu ý: Thay thế abbiến bằng số dòng trước và sau.

Nó đặc biệt hữu ích cho hệ thống mà không hỗ trợ của grep -A, -B-Ccác thông số.


4
$ grep thestring thefile -5

-5giúp bạn có 5các dòng trên và dưới trận đấu 'thestring' tương đương với -C 5hoặc -A 5 -B 5.


4

Grep có một tùy chọn được gọi Context Line Control, bạn có thể sử dụng --contexttrong đó, đơn giản,

| grep -C 5

hoặc là

| grep -5

Nên làm thủ thuật


1

Tôi sử dụng để làm cách nhỏ gọn

grep -5 string file

Đó là tương đương với

grep -A 5 -B 5 string file

0

Nếu bạn tìm kiếm mã thường xuyên, AG trình tìm kiếm bạc hiệu quả hơn nhiều (tức là nhanh hơn) so với grep.

Bạn hiển thị các dòng ngữ cảnh bằng cách sử dụng tùy chọn -C.

Ví dụ:

ag -C 3 "foo" myFile

line 1
line 2
line 3
line that has "foo"
line 5
line 6
line 7
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.