Làm cách nào để giới hạn số lượng kết quả trả về từ grep?


180

Tôi muốn nói tối đa 10 dòng từ grep.

Tôi không muốn máy tính của tôi làm việc chăm chỉ. Tôi muốn nó dừng lại sau 10 kết quả được tìm thấy bởi grep. Có thể không?


Trong trường hợp của bạn, bạn không muốn máy tính hoạt động mạnh .. Nhưng nếu đó chỉ là vấn đề về khả năng đọc của con người, bạn có thể sử dụng lessqua đường ống. Điều đó sẽ lấp đầy màn hình và bạn có thể nhấn ENTER để xem nhiều dòng hơn và qthoát:grep "SomeText" somefile.csv | less
SilentSteel

Câu trả lời:


240

Các -mtùy chọn có lẽ là những gì bạn đang tìm kiếm:

grep -m 10 PATTERN [FILE]

Từ man grep:

-m NUM, --max-count=NUM
        Stop reading a file after NUM matching lines.  If the  input  is
        standard  input  from a regular file, and NUM matching lines are
        output, grep ensures that the standard input  is  positioned  to
        just  after the last matching line before exiting, regardless of
        the presence of trailing context lines.  This enables a  calling
        process  to resume a search.

Lưu ý: grep dừng đọc tệp sau khi đã tìm thấy số lượng trận đấu được chỉ định!


3
hi nó đã thử nó về cơ bản hoạt động nhưng có vẻ như grep "dừng" suy nghĩ sau khi anh ta tìm thấy 10 dòng đầu tiên, có vẻ như anh ta tiếp tục suy nghĩ và "sử dụng cpu của tôi" và không in nó có đúng không? tiếng Phạn
Jas

6
@Jason: điều này dường như không phải là trường hợp: grep mất 0,005 giây -m 1và 1,579 giây mà không có trên một tệp có 10 triệu dòng trên máy tính xách tay của tôi.
Grégoire

3
tailNói chung, đường ống vào sẽ hoạt động, nhưng đặc biệt là nếu bạn đang kết hợp với bối cảnh, ví dụ: grep -A10 PATTERNsử dụng tailcắt ngắn bối cảnh, thay vì số lượng kết quả. Câu trả lời này là những gì tôi đang tìm kiếm.
dimo414

1
-m 10là tùy chọn tạo ra sự khác biệt khi grepping nhiều tệp! Đường ống đến đầu sẽ không hiển thị kết quả khớp trong các tệp tiếp theo nếu có quá nhiều kết quả khớp trong tệp đầu tiên. Cảm ơn !
Julien

1
IMHO điều này nên được đánh dấu là câu trả lời được chấp nhận, vì nó không yêu cầu công cụ khác. BTW sẽ dễ nhớ tùy chọn này hơn khi biết rằng đó là lối tắt của
--max

68

Một tùy chọn khác chỉ là sử dụng đầu :

grep ...parameters... yourfile | head

Điều này sẽ không yêu cầu tìm kiếm toàn bộ tệp - nó sẽ dừng khi tìm thấy mười dòng phù hợp đầu tiên. Một ưu điểm khác với phương pháp này là sẽ trả về không quá 10 dòng ngay cả khi bạn đang sử dụng grep với tùy chọn -o.

Ví dụ: nếu tệp chứa các dòng sau:

112233
223344
123123

Sau đó, đây là sự khác biệt trong đầu ra:

$ grep -o '1.' tài khoản của bạn | đầu -n2
11
12

$ grep -m2 -o '1.'
11
12
12

Sử dụng headtrả về chỉ có 2 kết quả như mong muốn, trong khi -m2 trả về 3.


3
Lưu ý rằng bạn không thể sử dụng | headđường ống khi sử dụng grepvới -Ahoặc -B(và do đó không chỉ tìm kiếm kết quả ( -o) mà còn cho bối cảnh). Trong trường hợp đó, bạn còn lại -mđể nói với grep số dòng có kết quả được trả về.
Attila O.

17
Sử dụng head không thực sự ngăn grep chạy qua toàn bộ tập tin. Sử dụng tùy chọn -m trong grep nào.
LopSae

7

Cách tiếp cận Awk:

awk '/pattern/{print; count++; if (count==10) exit}' file

0

Sử dụng đuôi:

#dmesg 
...
...
...
[132059.017752] cfg80211:   (57240000 KHz - 65880000 KHz @ 2160000 KHz), (N/A, 4000 mBm)
[132116.566238] cfg80211: Calling CRDA to update world regulatory domain
[132116.568939] cfg80211: World regulatory domain updated:
[132116.568942] cfg80211:   (start_freq - end_freq @ bandwidth), (max_antenna_gain, max_eirp)
[132116.568944] cfg80211:   (2402000 KHz - 2472000 KHz @ 40000 KHz), (300 mBi, 2000 mBm)
[132116.568945] cfg80211:   (2457000 KHz - 2482000 KHz @ 40000 KHz), (300 mBi, 2000 mBm)
[132116.568947] cfg80211:   (2474000 KHz - 2494000 KHz @ 20000 KHz), (300 mBi, 2000 mBm)
[132116.568948] cfg80211:   (5170000 KHz - 5250000 KHz @ 40000 KHz), (300 mBi, 2000 mBm)
[132116.568949] cfg80211:   (5735000 KHz - 5835000 KHz @ 40000 KHz), (300 mBi, 2000 mBm)
[132120.288218] cfg80211: Calling CRDA for country: GB
[132120.291143] cfg80211: Regulatory domain changed to country: GB
[132120.291146] cfg80211:   (start_freq - end_freq @ bandwidth), (max_antenna_gain, max_eirp)
[132120.291148] cfg80211:   (2402000 KHz - 2482000 KHz @ 40000 KHz), (N/A, 2000 mBm)
[132120.291150] cfg80211:   (5170000 KHz - 5250000 KHz @ 40000 KHz), (N/A, 2000 mBm)
[132120.291152] cfg80211:   (5250000 KHz - 5330000 KHz @ 40000 KHz), (N/A, 2000 mBm)
[132120.291153] cfg80211:   (5490000 KHz - 5710000 KHz @ 40000 KHz), (N/A, 2700 mBm)
[132120.291155] cfg80211:   (57240000 KHz - 65880000 KHz @ 2160000 KHz), (N/A, 4000 mBm)
alex@ubuntu:~/bugs/navencrypt/dev-tools$ dmesg | grep cfg8021 | head 2
head: cannot open 2 for reading: No such file or directory
alex@ubuntu:~/bugs/navencrypt/dev-tools$ dmesg | grep cfg8021 | tail -2
[132120.291153] cfg80211:   (5490000 KHz - 5710000 KHz @ 40000 KHz), (N/A, 2700 mBm)
[132120.291155] cfg80211:   (57240000 KHz - 65880000 KHz @ 2160000 KHz), (N/A, 4000 mBm)
alex@ubuntu:~/bugs/navencrypt/dev-tools$ dmesg | grep cfg8021 | tail -5
[132120.291148] cfg80211:   (2402000 KHz - 2482000 KHz @ 40000 KHz), (N/A, 2000 mBm)
[132120.291150] cfg80211:   (5170000 KHz - 5250000 KHz @ 40000 KHz), (N/A, 2000 mBm)
[132120.291152] cfg80211:   (5250000 KHz - 5330000 KHz @ 40000 KHz), (N/A, 2000 mBm)
[132120.291153] cfg80211:   (5490000 KHz - 5710000 KHz @ 40000 KHz), (N/A, 2700 mBm)
[132120.291155] cfg80211:   (57240000 KHz - 65880000 KHz @ 2160000 KHz), (N/A, 4000 mBm)
alex@ubuntu:~/bugs/navencrypt/dev-tools$ dmesg | grep cfg8021 | tail -6
[132120.291146] cfg80211:   (start_freq - end_freq @ bandwidth), (max_antenna_gain, max_eirp)
[132120.291148] cfg80211:   (2402000 KHz - 2482000 KHz @ 40000 KHz), (N/A, 2000 mBm)
[132120.291150] cfg80211:   (5170000 KHz - 5250000 KHz @ 40000 KHz), (N/A, 2000 mBm)
[132120.291152] cfg80211:   (5250000 KHz - 5330000 KHz @ 40000 KHz), (N/A, 2000 mBm)
[132120.291153] cfg80211:   (5490000 KHz - 5710000 KHz @ 40000 KHz), (N/A, 2700 mBm)
[132120.291155] cfg80211:   (57240000 KHz - 65880000 KHz @ 2160000 KHz), (N/A, 4000 mBm)
alex@ubuntu:~/bugs/navencrypt/dev-tools$ 

Bạn có thể đặt "định dạng mã" bằng cách nhấp vào biểu tượng như "{}" trong trình chỉnh sửa.
peterh - Phục hồi Monica

Sẽ hữu ích khi cung cấp các ví dụ dễ đọc hơn loooonl loooog liiines
Putnik

0

Đối với 2 trường hợp sử dụng:

  1. Tôi chỉ muốn n kết quả tổng thể, không phải n kết quả cho mỗi tệp, grep -m 2là mỗi lần xuất hiện tối đa của tệp.
  2. Tôi thường sử dụng git grepmà không mất-m

Một lựa chọn tốt trong các tình huống này là grep | sed 2qgrep 2 lần xuất hiện đầu tiên trên tất cả các tệp. tài liệu sed: https://www.gnu.org/software/sed/manual/sed.html

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.