2008-12-16 22 views
225

Ich habe eine Reihe von Protokolldateien. Ich muss herausfinden, wie oft eine Zeichenfolge in allen Dateien auftritt.Zählen alle Vorkommen einer Zeichenfolge in vielen Dateien mit grep

grep -c string * 

kehrt

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

ein Rohr konnte ich verwenden nur Dateien zu erhalten, die ein oder mehrere Vorkommen haben:

grep -c string * | grep -v :0 

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

Wie ich nur die kombinierte Zählung zu bekommen? (Wenn es file4:5, file5:1, file6:2 zurückgibt, möchte ich zurück 8.)

+0

Können Sie mir sagen, was das grep -v: 0 tut? . Ich weiß, dass es für Dateien mit Vorkommen größer als 0 zählt. Was bedeutet die Option -v und: 0? Bitte lass es mich wissen. –

+0

@GauthamHonnavara grep: 0 sucht nach einer Zeile, die mit der Zeichenfolge übereinstimmt: 0. -v ist eine Option, um diese Suche zu invertieren, stattdessen mit grep -v: 0 bedeutet, dass alle Zeilen gefunden werden, die nicht enthalten: 0 also würde eine Zeile mit Datei4: 5 und Datei27: 193 alle durchlaufen, da sie nicht enthalten: 0 – penguin359

Antwort

230
cat * | grep -c string 
+7

Dies hat die gleiche Einschränkung, dass es mehrere Vorkommen in einer Zeile nur einmal zählt. Ich vermute, dass dieses Verhalten in diesem Fall in Ordnung ist. –

+0

@Michael Haren Ja, es könnte nur ein Vorkommen von String in einer Zeile sein. –

+2

Ich würde lieber 'grep -c string <*' Also nur den Platz mit einem weniger als ersetzen. –

19

Anstelle von -c, nur Rohr es nach wc-l.

grep string * | wc -l 

Dies wird jedes Vorkommnis in einer einzigen Zeile auflisten und dann die Anzahl der Zeilen zählen.

Dies wird Instanzen vermissen, in denen die Zeichenfolge 2+ Mal in einer Zeile auftritt.

+2

Piping zu "wc -l" funktioniert auch gut zusammen mit "grep -r 'test'." die rekursiv alle Dateien für die Zeichenfolge 'test' in allen Verzeichnissen unterhalb der aktuellen abtastet. – nottinhill

13
cat * | grep -c string 

Eines der seltenen nützlichen Anwendungen von cat.

256

Diese für mehrere Vorkommen pro Zeile funktioniert:

grep -o string * | wc -l 
+2

Das funktioniert auch: 'grep -o Zeichenfolge * --exclude-dir = einige/dir/one/--exclude-dir = einige/dir/two | wc -l'. –

+2

'grep -ioR Zeichenfolge * | wc -l' ist das, was ich benutze, um eine Suche ohne Berücksichtigung der Groß-/Kleinschreibung durchzuführen, rekursive Suche nur nach Übereinstimmungen – LeonardChallis

+0

Diese zeigt die relevanten Dateien und dann die Gesamtzahl der Übereinstimmungen: 'grep -rc test. | awk -F: '$ NF> 0 {x + = $ NF; $ NF = ""; print} ENDE {print "Total:", x} ' – Yaron

6

Obligatorische AWK Lösung:

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

Vorsicht, wenn die Dateinamen ":" though.

5

Die AWK-Lösung, die auch Dateinamen einschließlich Doppelpunkte Griffe:

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

Beachten Sie, dass diese Methode immer noch tut nicht mehrere Vorkommen von string auf der gleichen Linie zu finden.

23
grep -oh string * | wc -w 

werden mehrere Vorkommen in einer Linie

+14

'grep -oh" ... mein Curry war stark "* >> wc' :) – icc97

9

Etwas anders als alle bisherigen Antworten zählen:

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

Schön, einen Ansatz zu sehen, der grep nicht verwendet, besonders als grep (unter Windows) unterstützt die Option -o nicht. –

5

Sie können -R hinzufügen rekursiv suchen (und nicht die Katze verwenden) und -I Binärdateien ignorieren.

grep -RIc string . 
0

Ein anderer oneliner, der grundlegende Befehlszeilenfunktionen verwendet, die mehrere Vorkommen pro Zeile behandeln.

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

Hier ist eine schneller als grep AWK alternative Art und Weise, dies zu tun, die mehrere Spiele von <url> pro Zeile behandelt, innerhalb einer Sammlung von XML-Dateien in einem Verzeichnis:

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

Dies funktioniert gut in Fällen, in denen einige XML-Dateien keine Zeilenumbrüche haben.

0

Sie können eine einfache grep verwenden, um die Anzahl der Vorkommen effektiv zu erfassen. Ich werde die -i Option verwenden, um sicherzustellen, dass STRING/StrING/string richtig erfasst werden.

Befehlszeile, die den Namen Dateien gibt:

grep -oci string * | grep -v :0 

Befehlszeile, die die Dateinamen und druckt 0 entfernt, wenn es eine Datei ohne Vorkommen ist:

grep -ochi string * 
+0

Könnten Sie bitte mehr Ihre Antwort ausarbeiten, indem Sie etwas mehr über die von Ihnen angebotene Lösung hinzufügen? – abarisone

1

nur Grep Lösung, die ich getestet mit grep für windows:

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

Diese Lösung zählt alle Vorkommen es auch wenn es mehrere auf einer Linie gibt. -r durchsucht rekursiv das Verzeichnis, -o wird "nur den Teil einer Zeile anzeigen, die PATTERN entspricht" - dies teilt mehrere Vorkommen in einer einzelnen Zeile auf und lässt grep jede Übereinstimmung in einer neuen Zeile drucken; Dann leiten Sie diese Zeilentrennungs-Ergebnisse in grep mit -c zurück, um die Anzahl der Vorkommen mit demselben Muster zu zählen.

2

kurze rekursive Variante:

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