Bir dizenin tüm oluşumlarını grep ile birçok dosyada sayın


289

Bir sürü günlük dosyam var. Bir dize tüm dosyalarda kaç kez oluştuğunu bulmak gerekir.

grep -c string *

İadeler

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

Bir pipet kullanarak sadece bir veya daha fazla olayı olan dosyaları alabildim:

grep -c string * | grep -v :0

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

Yalnızca birleşik sayımı nasıl alabilirim? (Geri gelirse file4:5, file5:1, file6:2, geri dönmek istiyorum 8.)


1
Bana grep -v: 0'ın ne yaptığını söyleyebilir misiniz? . Ben 0'dan büyük olayları olan dosyalar için sayılır biliyorum. -V seçeneği ve: 0 ne anlama geliyor? Lütfen bana bildirin.
Gautham Honnavara

@GauthamHonnavara grep: 0 dizeyle eşleşen satırı arar: 0. -v bu aramayı tersine çevirmek için bir seçenektir, grep -v: 0 yerine şunu içermez: 0 içermeyen tüm satırları bulmak demektir; 0
penguin359

Alanı kullanarak birden fazla dosya seçebilirsiniz. grep file1 file2 --options
Dnyaneshwar Harer

Yanıtlar:


288
cat * | grep -c string

9
Bu, bir satırdaki birden çok örneği yalnızca bir kez saymasıyla aynı sınırlamaya sahiptir. Yine de, bu durumda bu davranışın yolunda olduğunu tahmin ediyorum.
Michael Haren

@Michael Haren Evet, bir satırda yalnızca bir dize oluşumu olabilir.
jeljko Filipin

2
Ben grep -c string<*sadece alanı daha az ile değiştirmeyi tercih ederim .
JamesM-SiteGen

48
Bir satırda birden fazla olayı ele almaz
bluesman

2
Bu çok alt dizinlerinde aramak isterseniz çalışmak, oysa gelmez grep -ove wc -lyok. orijinal soru gibi durumlarda kedi daha hızlıdır.
Leagsaidh Gordon

296

Bu, satır başına birden çok tekrar için geçerlidir:

grep -o string * | wc -l

2
Bu aynı zamanda çalışır: grep -o string * --exclude-dir=some/dir/one/ --exclude-dir=some/dir/two | wc -l.
bir kodlayıcı

2
grep -ioR string * | wc -lbüyük / küçük harfe duyarlı olmayan, özyinelemeli, yalnızca eşleşen bir arama yapmak için kullandığım şey budur
LeonardChallis 28:15

2
Bu, ilgili dosyaları ve daha sonra toplam eşleşme sayısını gösterir:grep -rc test . | awk -F: '$NF > 0 {x+=$NF; $NF=""; print} END{print "Total:",x}'
Yaron

28
grep -oh string * | wc -w

bir satırdaki birden çok örneği sayar


24
grep -oh "... my that curry was strong" * >> wc:)
icc97

23

-C kullanmak yerine, sadece wc -l'ye bağlayın.

grep string * | wc -l

Bu, her bir olayı tek bir satırda listeleyecek ve daha sonra satır sayısını sayacaktır.

Bu, dizenin bir satırda 2+ kez gerçekleştiği örnekleri kaçırır.


2
"Wc -l" bağlantısı "grep -r 'test" ile birlikte iyi çalışır. geçerli dosyaların altındaki tüm dizinlerde 'test' dizesi için tüm dosyaları özyinelemeli olarak tarar.
stevek


9

Önceki tüm cevaplardan farklı bir şey:

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

grep kullanmayan bir yaklaşım görmek güzel, esp benim grep (windows üzerinde) -o seçeneğini desteklemiyor gibi.
David Roussel

9

-RYinelemeli olarak aramaya (ve cat kullanmaktan kaçının) ve -Iikili dosyaları yok saymaya ekleyebilirsiniz .

grep -RIc string .

7

Zorunlu AWK çözümü:

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

Dosya adlarınızda ":" varsa dikkatli olun.


5

Sütunlar da dahil olmak üzere dosya adlarını da işleyen AWK çözümü:

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

Bu yöntem hala gelmez unutmayın değil birden fazla kopyasını bulmak stringaynı satırda.


4

Dosya başına tekrar sayısı istiyorsanız ("tcp" dizesi için örnek):

grep -RIci "tcp" . | awk -v FS=":" -v OFS="\t" '$2>0 { print $2, $1 }' | sort -hr

Örnek çıktı:

53  ./HTTPClient/src/HTTPClient.cpp
21  ./WiFi/src/WiFiSTA.cpp
19  ./WiFi/src/ETH.cpp
13  ./WiFi/src/WiFiAP.cpp
4   ./WiFi/src/WiFiClient.cpp
4   ./HTTPClient/src/HTTPClient.h
3   ./WiFi/src/WiFiGeneric.cpp
2   ./WiFi/examples/WiFiClientBasic/WiFiClientBasic.ino
2   ./WiFiClientSecure/src/ssl_client.cpp
1   ./WiFi/src/WiFiServer.cpp

Açıklama:

  • grep -RIci NEEDLE . - NEEDLE dizesini sürekli olarak geçerli dizinden (sembolik bağlantıları izleyerek) arar, ikili dosyaları yok sayar, olay sayısını sayar, vakayı yok sayar
  • awk ... - bu komut, sıfır tekrarlanan dosyaları yok sayar ve satırları formatlar
  • sort -hr - satırları ilk sütundaki sayılara göre tersine sıralar

Tabii ki, seçenek -c(count) ile diğer grep komutlarıyla da çalışır . Örneğin:

grep -c "tcp" *.txt | awk -v FS=":" -v OFS="\t" '$2>0 { print $2, $1 }' | sort -hr

3

grepOlay sayısını etkili bir şekilde yakalamak için bir basit kullanabilirsiniz . Bu -iseçeneği STRING/StrING/stringdoğru şekilde yakalandığından emin olmak için kullanacağım .

Dosyaların adını veren komut satırı:

grep -oci string * | grep -v :0

Dosya adlarını kaldıran ve oluşmayan bir dosya varsa 0 yazdıran komut satırı:

grep -ochi string *

Verdiğiniz çözüm hakkında biraz daha açıklama ekleyerek cevabınızı biraz daha açıklayabilir misiniz?
abarisone

3

kısa özyinelemeli varyant:

find . -type f -exec cat {} + | grep -c 'string'

1
Teşekkür ederim! Sadece çözümünüz benim için çalıştı (tüm dosyaların eşleşmelerini topladı).
Nestor

1

Windows için grep ile test ettiğim sadece Grep çözümü:

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

Bu çözüm, bir satırda birden fazla olsa bile tüm olayları sayacaktır. -rdizini özyinelemeli olarak arar, -o"yalnızca PATTERN ile eşleşen bir satır bölümünü gösterir" - bu, tek bir satırda birden çok olayı böler ve her bir eşleşmeyi yeni bir satırda yazdırır; daha sonra -caynı modeli kullanan tekrarlama sayısını saymak için satırsonu ile ayrılmış bu sonuçları tekrar grep'e ekleyin .


1

İşte bunu <url>bir dizindeki XML dosyaları koleksiyonu içinde satır başına birden çok eşleşmeyi işleyen, grep'ten daha hızlı bir AWK alternatif yolu :

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

Bu, bazı XML dosyalarında satır kesmeleri olmadığı durumlarda işe yarar.


0

Temel komut satırı işlevlerini kullanan başka bir oneliner, satır başına birden çok oluşum işliyor.

 cat * |sed s/string/\\\nstring\ /g |grep string |wc -l
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.