Tôi có thể grep chỉ n dòng đầu tiên của một tập tin?


126

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:


175

Sự kỳ diệu của đường ống;

head -10 log.txt | grep <whatever>

13
bạn cũng có thể dẫn một luồng tùy ý tới head:someCmd | head -10
Stuart Nelson

1
Đầu mặc định để in 10 dòng đầu tiên thành đầu ra tiêu chuẩn, do đó, điều này hợp lệ cho 10 dònghead log.txt | grep <whatever>
Zlemini

5
Có cách nào để làm điều này khi sử dụng -ltù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.
James M. Lay

49

Đố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 ndò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..nextfiledừ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

9
Tôi là một trong những người đã tìm thấy cái này trên Google. Cảm ơn!
Floris

Đối với tôi, mã này in ra đường dẫn đầy đủ của tệp. Đó chính xác là những gì tôi cần. Cũng FNR=1sẽ chỉ tìm kiếm dòng 1. Cảm ơn!
Brian W

2
Để thực hiện điều này một cách đệ quy qua một thư mục:find ./path -type -f -exec awk 'FNR>10 {nextfile} /pattern/ { print FILENAME ; nextfile }' '{}' +
OrangeDog

1
Cảm ơn @OrangeDog. Một điều chỉnh nhỏ: nên là-type f
David Siegal

26

Hoặc sử dụng awkcho 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_regexpkhớ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 ( -ncó 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.


1
Tại sao không bỏ thuốc vào ngày 10? (xem giải pháp sed)
potong

awk '{ if ( NR <= 10 ) { if(index($0,"ab") > 0) { print $0; } } else { exit; } }' textfile- nhanh hơn.

1
@potong bạn nói đúng, đã sửa. @srikanthradix trong khi có thể nhanh hơn thì giải pháp của bạn không phải là tìm kiếm regexps mà chỉ cho các chuỗi cố định. awk '{ if ( NR <= 10 ) { if( $0 ~ "YOUR_REGEXP") { print } } else { exit; } }' textfilelàm.
Zsolt Botykai

4
Cộng với phong cách thì không awkish. 2xifs1xelsetrong một lệnh không cần tuyên bố hành động sẽ làm aho. weinberger và kernighan khóc ...
jaypal singh

1
Tôi nghĩ, thay vì NR, sẽ tốt hơn nếu sử dụng FNR, bởi vì nếu bạn sử dụng awk với nhiều tệp thì FNR bắt đầu từ 0 cho mỗi tệp.
Vladyslav Savigan

9

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 ...

headsẽ xuất ra 10 dòng đầu tiên (sử dụng -ntùy chọn), và sau đó bạn có thể dẫn đầu ra đó grep.


6
Tôi thậm chí không nhận ra, tất cả các giải pháp ở đây sử dụng headđã sử dụng -n 10 (bao gồm cả tôi) không nhận ra rằng headtheo mặc định chỉ hiển thị 10 dòng . :)
jaypal singh


3

Bạn có thể sử dụng dòng sau:

head -n 10 /path/to/file | grep [...]

3

Đầu ra của head -10 filecó 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

3
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.

1
Nếu tôi nhớ lại, -C 2sẽ làm tương tự như-A 2 -B 2
David LeBauer

3
grep -m6 "string" cov.txt

Điều này chỉ tìm kiếm 6 dòng đầu tiên cho string


3
Không, điều này sẽ cung cấp cho bạn 6 lần xuất hiện đầu tiên của "chuỗi" trong toàn bộ tệp cov.txt
franzisk

2

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 headvớ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)


1

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".


1
Mặc dù nó có thể đúng. thêm mô tả câu hỏi để làm cho câu trả lời toàn diện hơn.
Pramod S. Nikam

3
Điều này trả lời một câu hỏi hoàn toàn khác và không hữu ích trong bối cảnh này.
Pre101

-1

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.

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.