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?
man grep | grep -C 1 context:)
man grep | grep -C 1 "\-C";)
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?
man grep | grep -C 1 context:)
man grep | grep -C 1 "\-C";)
Câu trả lời:
Đố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.
-Avà -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).
-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
-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.
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ã.
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 ...
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
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
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
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;
ripgrepNế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-contextvà -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.
Đâ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ế avà bbiế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, -Bvà -Ccác thông số.
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