2008-12-16 47 views
225

Tôi có một loạt tệp nhật ký. Tôi cần phải tìm ra bao nhiêu lần một chuỗi xảy ra trong tất cả các tập tin.Đếm tất cả các lần xuất hiện của một chuỗi trong nhiều tệp với grep

grep -c string * 

lợi nhuận

... 
file1:1 
file2:0 
file3:0 
... 

Sử dụng một ống tôi đã có thể để có được các tập tin chỉ có một hoặc nhiều lần xuất hiện:

grep -c string * | grep -v :0 

... 
file4:5 
file5:1 
file6:2 
... 

Làm thế nào tôi có thể nhận được chỉ đếm kết hợp? (Nếu nó trả về file4:5, file5:1, file6:2, tôi muốn quay lại 8.)

+0

Bạn có thể cho tôi biết những gì -v grep: 0 không? . Tôi biết nó đếm cho các tập tin có sự xuất hiện lớn hơn 0. Tùy chọn -v và 0 có nghĩa là gì? Vui lòng cho tôi biết. –

+0

@GauthamHonnavara grep: 0 tìm dòng phù hợp với chuỗi: 0. -v là một tùy chọn để đảo ngược tìm kiếm đó thay vì sử dụng grep -v: 0 có nghĩa là tìm tất cả các dòng không chứa: 0 để một dòng với tệp4: 5 và tệp27: 193 tất cả sẽ đi qua vì chúng không chứa: 0 – penguin359

Trả lời

230
cat * | grep -c string 
+7

Điều này có cùng giới hạn rằng nó tính nhiều lần xuất hiện trên một dòng chỉ một lần. Tôi đoán rằng hành vi này là OK trong trường hợp này, mặc dù. –

+0

@Michael Haren Vâng, có thể chỉ có một lần xuất hiện của chuỗi trong một dòng. –

+2

Tôi muốn làm 'grep -c string <*' Vì vậy, chỉ cần thay thế không gian bằng một ít hơn. –

19

Thay vì sử dụng -c, chỉ cần đường ống đến wc -l.

grep string * | wc -l 

Điều này sẽ liệt kê từng lần xuất hiện trên một dòng và sau đó đếm số dòng.

Điều này sẽ bỏ lỡ các trường hợp chuỗi xảy ra 2 lần trên một dòng.

+2

Đường ống đến "wc -l" hoạt động cũng độc đáo cùng với "grep -r 'test'." mà quét đệ quy tất cả các tập tin cho chuỗi 'thử nghiệm' trong tất cả các thư mục bên dưới hiện tại. – nottinhill

13
cat * | grep -c string 

Một trong những ứng dụng hữu ích hiếm hoi của cat.

256

này làm việc cho nhiều lần xuất hiện trên mỗi dòng:

grep -o string * | wc -l 
+2

Điều này cũng hoạt động: 'grep -o string * --exclude-dir = một số/dir/one/--exclude-dir = some/dir/two | wc -l'. –

+2

'grep -ioR string * | wc -l' là những gì tôi sử dụng để thực hiện tìm kiếm không phân biệt dạng chữ, đệ quy, chỉ tìm kiếm phù hợp – LeonardChallis

+0

Phần này hiển thị các tệp có liên quan và sau đó tổng số lần khớp: 'grep -rc test. | awk -F: '$ NF> 0 {x + = $ NF; $ NF = ""; print} END {print "Tổng số:", x} '' – Yaron

6

buộc AWK giải pháp:

grep -c string * | awk 'BEGIN{FS=":"}{x+=$2}END{print x}' 

Hãy cẩn thận nếu tên tập tin của bạn bao gồm ":" mặc dù.

5

Giải pháp AWK mà cũng xử lý tên tập tin bao gồm cả dấu hai chấm:

grep -c string * | sed -r 's/^.*://' | awk 'BEGIN{}{x+=$1}END{print x}' 

Hãy ghi nhớ rằng phương pháp này vẫn không không tìm thấy nhiều lần xuất hiện của string trên cùng một dòng.

23
grep -oh string * | wc -w 

sẽ tính nhiều lần xuất hiện trong một dòng

+14

' grep -oh "... cà ri của tôi rất mạnh" * >> wc' :) – icc97

9

Something khác so với tất cả các câu trả lời trước:

perl -lne '$count++ for m/<pattern>/g;END{print $count}' * 
+0

để xem cách tiếp cận không sử dụng grep, đặc biệt là grep của tôi (trên cửa sổ) không hỗ trợ tùy chọn -o. –

5

Bạn có thể thêm -R để tìm kiếm đệ quy (và không sử dụng mèo) và -I để bỏ qua các tệp nhị phân.

grep -RIc string . 
0

Một oneliner khác sử dụng các chức năng dòng lệnh cơ bản xử lý nhiều lần xuất hiện trên mỗi dòng.

cat * |sed s/string/\\\nstring\ /g |grep string |wc -l 
1

Đây là một nhanh hơn grep AWK cách khác để làm điều này, trong đó xử lý nhiều trận đấu của <url> mỗi dòng, trong một bộ sưu tập các tập tin XML trong một thư mục:

awk '/<url>/{m=gsub("<url>","");total+=m}END{print total}' some_directory/*.xml 

tác phẩm này tốt trong trường hợp một số tệp XML không có ngắt dòng.

0

Bạn có thể sử dụng đơn giản grep để nắm bắt số lần xuất hiện hiệu quả. Tôi sẽ sử dụng tùy chọn -i để đảm bảo STRING/StrING/string được chụp đúng cách.

dòng

lệnh cung cấp cho tên file:

grep -oci string * | grep -v :0 

dòng lệnh mà loại bỏ các tên tập tin và in 0 nếu có một tập tin mà không xuất hiện:

grep -ochi string * 
+0

Bạn có thể vui lòng xây dựng thêm câu trả lời của bạn thêm mô tả chi tiết hơn về giải pháp bạn cung cấp không? – abarisone

1

Grep chỉ giải pháp mà tôi thử nghiệm với grep cho cửa sổ:

grep -ro "pattern to find in files" "Directory to recursively search" | grep -c "pattern to find in files" 

Giải pháp này sẽ tính tất cả các lần xuất hiện es ngay cả khi có nhiều trên một dòng. -r đệ quy tìm kiếm thư mục, -o sẽ "chỉ hiển thị một phần của một dòng phù hợp với PATTERN" - đây là những gì chia nhỏ nhiều lần xuất hiện trên một dòng và làm cho grep in mỗi kết quả khớp trên một dòng mới; sau đó kết nối các kết quả được phân tách bằng dòng mới này thành grep với -c để đếm số lần xuất hiện bằng cùng một mẫu.

2

ngắn đệ quy biến thể:

find . -type f -exec cat {} + | grep -c 'string' 
Các vấn đề liên quan