2009-03-30 34 views
9

Tôi có một danh sách các mẫu trong một tập tin văn bản, mà tôi sử dụng bzgrep để phù hợp trên nhiều tập tin:trong khi grep nhiều tệp, làm thế nào để dừng sau khi kết hợp đầu tiên?

for pattern in $(cat ~/patterns.txt); do echo $pattern; bzgrep -i $pattern *.bz2; done 

Làm thế nào để làm cho bzgrep (grep) dừng lại sau trận đấu đầu tiên của mô hình hiện tại (tôi cần nó dừng lại hoàn toàn, không dừng lại trên tập tin hiện tại được grep'ed) và đi vào mô hình tiếp theo. Tôi đã đọc về tham số "-m 1", nhưng tôi nghĩ nó chỉ dừng lại trên tập tin hiện tại. Ý tưởng nào?

Cảm ơn

Trả lời

11

Ống đầu ra của grep là head -n 1; sẽ kéo (& truyền vào) dòng đầu tiên và bỏ qua phần còn lại (tức là giết đường ống nguồn).

4

Bạn có thể sử dụng công tắc -q (--quiet aka --silent). Sau đó kiểm tra xem lệnh đã hoàn thành thành công hay chưa. Điều này không có kết quả đầu ra và ngừng tìm kiếm ngay lập tức khi tìm thấy một kết quả phù hợp, và chỉ trả về thành công hay thất bại.

4
for pattern in $(< ~/patterns.txt); do 
    echo "$pattern" 
    for i in *.bz2; do 
    bzgrep -i "$pattern" "$i" && break 
    done 
done 

Bạn có thể muốn thêm -H để grep để hiển thị tên tệp: dòng chứ không chỉ là dòng.

1

Dưới đây là một ví dụ:

for i in ~/bin/*; do grep -m 1 lua $i /dev/null && break; done 

Các công trình tương tự với bzgrep; sau trận đấu thành công đầu tiên bạn thoát khỏi vòng lặp.

Bao gồm /dev/null đưa bạn tên tệp trong trường hợp bạn có một số loại grep khủng long không nhận ra tùy chọn -H.

+0

Sử dụng 'grep -m 1' có vẻ là câu trả lời hay nhất, ngạc nhiên là không có phiếu bầu trước đó –

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