Tôi muốn grep
cho 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 grep
cho 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 num
cho 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.
-A
và -B
sẽ hoạt động, như ý muốn -C n
(đối với n
các dòng của bối cảnh), hoặc chỉ -n
(cho n
cá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ì 15
nó trả về 5 dòng
-A
, -B
hoặ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 -15
là được diễn giải -1 -5
(hai tùy chọn riêng biệt) và -5
ghi đè 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;
ripgrep
Nếu bạn quan tâm đến hiệu suất, hãy sử dụng ripgrep
có 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
và -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ế a
và b
biế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
và -C
cá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