Tôi có tệp nhật ký rất dài, có thể yêu cầu grep chỉ tìm kiếm 10 dòng đầu tiên không?
Tôi có tệp nhật ký rất dài, có thể yêu cầu grep chỉ tìm kiếm 10 dòng đầu tiên không?
Câu trả lời:
Sự kỳ diệu của đường ống;
head -10 log.txt | grep <whatever>
head log.txt | grep <whatever>
-l
tùy chọn của grep không? Tôi muốn liệt kê tất cả các tệp có 5 ký tự đầu tiên RIFFD
.
Đối với những người tìm thấy điều này trên Google, tôi cần tìm kiếm những n
dòng đầu tiên của nhiều tệp, nhưng chỉ in tên tệp phù hợp. Tôi đã sử dụng
gawk 'FNR>10 {nextfile} /pattern/ { print FILENAME ; nextfile }' filenames
Việc FNR..nextfile
dừng xử lý một tệp khi 10 dòng đã được nhìn thấy. Các //..{}
bản in tên tập tin và di chuyển trên bất cứ khi nào trận đấu đầu tiên trong một chương trình tập tin từ bỏ. Để trích dẫn tên tệp vì lợi ích của các chương trình khác, hãy sử dụng
gawk 'FNR>10 {nextfile} /pattern/ { print "\"" FILENAME "\"" ; nextfile }' filenames
FNR=1
sẽ chỉ tìm kiếm dòng 1. Cảm ơn!
find ./path -type -f -exec awk 'FNR>10 {nextfile} /pattern/ { print FILENAME ; nextfile }' '{}' +
-type f
Hoặc sử dụng awk
cho một quy trình duy nhất mà không |
:
awk '/your_regexp/ && NR < 11' INPUTFILE
Trên mỗi dòng, nếu your_regexp
khớp và số lượng bản ghi (dòng) nhỏ hơn 11, thì nó thực thi hành động mặc định (đang in dòng đầu vào).
Hoặc sử dụng sed
:
sed -n '/your_regexp/p;10q' INPUTFILE
Kiểm tra biểu thức chính quy của bạn và in dòng ( -n
có nghĩa là không in đầu vào, nếu không là mặc định) và thoát ngay sau dòng thứ 10.
awk '{ if ( NR <= 10 ) { if(index($0,"ab") > 0) { print $0; } } else { exit; } }' textfile
- nhanh hơn.
awk '{ if ( NR <= 10 ) { if( $0 ~ "YOUR_REGEXP") { print } } else { exit; } }' textfile
làm.
awkish
. 2xifs
và 1xelse
trong một lệnh không cần tuyên bố hành động sẽ làm aho. weinberger và kernighan khóc ...
Bạn có một vài lựa chọn sử dụng các chương trình cùng với grep
. Theo tôi, đơn giản nhất là sử dụng head
:
head -n10 filename | grep ...
head
sẽ xuất ra 10 dòng đầu tiên (sử dụng -n
tùy chọn), và sau đó bạn có thể dẫn đầu ra đó grep
.
head
đã sử dụng -n 10
(bao gồm cả tôi) không nhận ra rằng head
theo mặc định chỉ hiển thị 10 dòng . :)
grep "pattern" <(head -n 10 filename)
Đầu ra của head -10 file
có thể được dẫn đến grep
để thực hiện điều này:
head -10 file | grep …
Sử dụng Perl:
perl -ne 'last if $. > 10; print if /pattern/' file
head -10 log.txt | grep -A 2 -B 2 pattern_to_search
-A 2
: in hai dòng trước mẫu.
-B 2
: in hai dòng sau mẫu.
head -10 log.txt # read the first 10 lines of the file.
-C 2
sẽ làm tương tự như-A 2 -B 2
grep -m6 "string" cov.txt
Điều này chỉ tìm kiếm 6 dòng đầu tiên cho string
Một phần mở rộng cho câu trả lời của Joachim Isaksson: Khá thường xuyên tôi cần một cái gì đó từ giữa một tệp dài, ví dụ: dòng 5001 đến 5020, trong trường hợp bạn có thể kết hợp head
với tail
:
head -5020 file.txt | tail -20 | grep x
Điều này nhận được 5020 dòng đầu tiên, sau đó chỉ hiển thị 20 dòng cuối cùng, sau đó chuyển mọi thứ sang grep.
(Đã chỉnh sửa: lỗi hàng rào trong số ví dụ của tôi, đã thêm đường ống vào grep)
grep -A 10 <Hoa văn>
Điều này là để lấy mẫu và 10 dòng tiếp theo sau mẫu. Điều này sẽ chỉ hoạt động tốt đối với một mẫu đã biết, nếu bạn không có mẫu đã biết, hãy sử dụng các đề xuất "đầu".
Tôi đã có một vấn đề tương tự và tất cả các vấn đề trên không giải quyết được hoàn toàn. Tôi cũng quan tâm đến việc lấy tên tệp chứa các dòng phù hợp. Giải pháp của tôi:
ls |parallel --gnu 'cat <(echo {}) <(head {})|grep -B1 -m1 -P "^>.*F3$"'
NB: Mẫu trong trường hợp của tôi luôn khớp với dòng đầu tiên.
head
:someCmd | head -10