2012-12-30 30 views
155

Tôi đang tìm kiếm một thư mục đệ quy bằng grep với các đối số sau đây với hy vọng chỉ trả về kết quả trùng khớp đầu tiên. Thật không may, nó trả về nhiều hơn một - trong thực tế hai lần cuối cùng tôi nhìn. Có vẻ như tôi có quá nhiều lý lẽ, đặc biệt là không có kết quả mong muốn. : -/Grep chỉ là trận đấu đầu tiên và dừng lại

# grep -o -a -m 1 -h -r "Pulsanti Operietur" /path/to/directory 

lợi nhuận:

Pulsanti Operietur 
Pulsanti Operietur 

lẽ grep không phải là cách tốt nhất để làm điều này? Bạn nói với tôi, cảm ơn rất nhiều.

Trả lời

262

-m 1 có nghĩa là trả lại kết quả trùng khớp đầu tiên trong bất kỳ tệp cụ thể nào. Nhưng nó vẫn sẽ tiếp tục tìm kiếm trong các tập tin khác. Ngoài ra, nếu có hai hoặc nhiều hơn phù hợp trong cùng một dòng, tất cả chúng sẽ được hiển thị.

Bạn có thể sử dụng head -1 để giải quyết vấn đề này:

grep -o -a -m 1 -h -r "Pulsanti Operietur" /path/to/dir | head -1 
+0

tuyệt vời! cảm ơn bạn. btw - là tất cả những đối số khác cần thiết mà tôi có trong lệnh? và những gì nếu tôi không thể ống nó một cách tình cờ (chỉ trong trường hợp). –

+2

Tôi không nghĩ rằng họ là cần thiết (ngoại trừ '-r' rõ ràng), nhưng họ không nên làm tổn thương (tôi sẽ không sử dụng' -a' mặc dù) – mvp

+1

Chính xác những gì tôi cần. Mẫu của tôi đã được tìm thấy hai lần trên cùng một dòng và 'grep -m 1' trả về cả hai trường hợp vì điều này. '| đầu -1' đã giải quyết nó! – harperville

12

Các grep-a-như chương trình ack có một lựa chọn -1 mà dừng lại ở trận đấu đầu tiên với mức giá thấp. Nó hỗ trợ các -m 1 mà @mvp đề cập đến là tốt. Tôi đặt nó ở đó bởi vì nếu tôi đang tìm kiếm một cây lớn của mã nguồn để tìm một cái gì đó mà tôi biết tồn tại trong một tập tin, nó không cần thiết để tìm thấy nó và phải nhấn Ctrl-C.

+0

để bạn có thể nói rằng ack nhanh hơn grep?Tôi thực sự quan tâm đến yếu tố tốc độ. –

+0

ack có thể nhanh hơn grep, tùy thuộc vào nội dung bạn đang tìm kiếm. Xin lưu ý rằng ack là về tìm kiếm mã nguồn. Nếu bạn đang tìm kiếm để tìm kiếm các tập tin chung, nó là ít tốt ở đó, ít nhất là trong ack 1.x. Hãy đọc về ack và xem liệu nó có phù hợp với nhu cầu của bạn không. –

+2

Tôi đã sử dụng Ack trong một thời gian dài nhưng gần đây đã chuyển sang [Trình tìm kiếm bạc] (https://github.com/ggreer/the_silver_searcher) mà tôi thấy nhanh hơn Ack –

4

Một lót duy nhất, sử dụng find:

find -type f -exec grep -lm1 "PATTERN" {} \; -a -quit 
+4

Điều này sẽ được * rất * chậm, như tìm sẽ đẻ trứng bản sao của grep cho mỗi tập tin được tìm thấy. 'grep -r' hoạt động nhanh hơn rất nhiều - bản sao duy nhất của nó thực hiện truyền tải thư mục. – mvp

+0

Đúng; mặc dù tìm thấy có thể được tùy chỉnh để chỉ hoạt động trên các kết quả được lọc, sau đó có thể làm cho hoạt động nhanh hơn nhiều so với một grep catch-all. Phụ thuộc vào ngữ cảnh. –

13

Bạn có thể đường ống grep kết quả để head kết hợp với stdbuf.

Lưu ý, rằng để đảm bảo dừng lại sau trận đấu thứ N, bạn cần phải sử dụng stdbuf để đảm bảo grep không đệm đầu ra của nó:

stdbuf -oL grep -rl 'pattern' * | head -n1 
stdbuf -oL grep -o -a -m 1 -h -r "Pulsanti Operietur" /path/to/dir | head -n1 
stdbuf -oL grep -nH -m 1 -R "django.conf.urls.defaults" * | head -n1 

Ngay sau khi head tiêu thụ 1 dòng, nó chấm dứt và grep sẽ nhận được SIGPIPE bởi vì nó vẫn còn đầu ra một cái gì đó để ống trong khi head đã biến mất.

Giả định rằng không có tên tệp nào chứa dòng mới.

Các vấn đề liên quan