2013-04-21 9 views
7

Tôi đang cố gắng để thực hiện tìm kiếm grep đệ quy như:Recursive Grep để chỉ hiển thị tổng matchin đếm

grep -r -c "foo" /some/directory 

mà cho tôi ra auch như:

/some/directory/somefile_2013-04-08.txt:0 
/some/directory/somefile_2013-04-09.txt:1 
/some/directory/somefile_2013-04-10.txt:4 
...etc 
tuy nhiên

, tôi muốn để chỉ nhận tổng số trận đấu trong tất cả các tệp, như:

Total matches: 5 

Tôi đã chơi xung quanh với một số ví dụ khác như in this thread, mặc dù tôi dường như không thể làm những gì nên đơn giản như vậy.

Trả lời

17
grep -ro "foo" /some/directory | wc -l | xargs echo "Total matches :" 

Các -o tùy chọn grep in tất cả các lần xuất hiện hiện tại của một chuỗi trong một tệp.

+0

cảm ơn, lệnh hữu ích. Tôi không chắc chắn đó là chính xác mặc dù, kể từ khi ví dụ của bạn tôi nhận được 447 trận đấu, và Johns tôi nhận được 392. Tôi sẽ phải chơi với nó nhiều hơn một chút để biết tôi đoán. –

+0

Lệnh này đã hoàn toàn phù hợp với tôi. Tôi đã cập nhật ví dụ của tôi để thêm một chuỗi cho bạn kết quả khi lệnh kết thúc. –

+1

Nhiều kết quả phù hợp trong một dòng, mỗi dòng sẽ tạo ra một dòng đầu ra riêng biệt với '-o'. – chepner

3
matches=$(grep -rch "foo" /some/directory | paste -sd+ - | bc) 
echo "Total matches: $matches" 

Mẫu dán/bc tổng hợp một danh sách các số. Xem: Bash command to sum a column of numbers.

+0

wow. lệnh tuyệt vời :) - rất khó để thêm "Tổng số trận đấu:" vào nó? –

+0

Tôi đã kết thúc với Halims, bởi vì nó kết hợp mọi thứ trong một dòng. Tôi chắc chắn sẽ giữ điều này một cách tiện dụng, vì nó có thể khá hữu ích. ty một lần nữa. –

1

Nếu bạn chỉ cần tổng số, bạn có thể bỏ qua việc số lượng cho mỗi tập tin, và chỉ cần có được một tổng số dòng hợp lệ:

grep -r "foo" /some/directory | wc -l 
+0

Điều này sẽ chỉ in từng dòng có một hoặc nhiều lần xuất hiện. Điều này sẽ không trả lại tất cả các lần xuất hiện hiện tại của một chuỗi hoặc mẫu. –

+0

Bạn chính xác. – btanaka

4

Chỉ cần ống để grep.

grep -r "foo" /some/directory | grep -c "foo"