Compter toutes les occurrences d'une chaîne dans beaucoup de fichiers avec grep

J'ai un tas de fichiers journaux. J'ai besoin de savoir combien de fois une chaîne se produit dans tous les fichiers.

grep -c string *

Renvoie

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

En utilisant un tuyau, j'ai pu obtenir uniquement des fichiers qui ont une ou plusieurs occurrences:

grep -c string * | grep -v :0

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

Comment puis-je obtenir uniquement le nombre combiné? (S'il retourne file4:5, file5:1, file6:2, je veux revenir 8.)

252
demandé sur Peter Mortensen 2008-12-16 15:12:56

15 réponses

cat * | grep -c string
262
répondu Bombe 2008-12-16 12:17:21

Cela fonctionne pour plusieurs occurrences par ligne:

grep -o string * | wc -l
276
répondu Jeremy Lavine 2010-07-14 19:31:55
grep -oh string * | wc -w

Comptera plusieurs occurrences dans une ligne

27
répondu Kaofu 2013-02-27 07:40:33

Au lieu d'utiliser-c, il suffit de le diriger vers wc-L.

grep string * | wc -l

Cela listera chaque occurrence sur une seule ligne, puis comptera le nombre de lignes.

Cela manquera des cas où la chaîne se produit 2+ fois sur une ligne, cependant.

20
répondu Michael Haren 2008-12-16 12:15:58
cat * | grep -c string

L'Une des rares applications utiles de cat.

15
répondu Joachim Sauer 2008-12-16 12:18:14

Quelque Chose de différent de toutes les réponses précédentes:

perl -lne '$count++ for m/<pattern>/g;END{print $count}' *
9
répondu Vijay 2017-06-18 08:26:30

Solution AWK obligatoire:

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

Faites attention si vos noms de fichiers incluent":".

6
répondu mumrah 2017-06-18 08:25:50

, Vous pouvez ajouter -R à la recherche récursive (et éviter d'utiliser cat) et -I pour ignorer les fichiers binaires.

grep -RIc string .
6
répondu azmeuk 2018-05-01 13:07:44

La solution AWK qui gère également les noms de fichiers, y compris les deux-points:

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

Gardez à l'esprit que cette méthode fait toujours Pas trouver plusieurs occurrences de string sur la même ligne.

5
répondu Kreuvf 2017-06-18 08:26:06

Court - récursive variante:

find . -type f -exec cat {} + | grep -c 'string'
2
répondu Dmitry Tarashkevich 2017-07-17 16:25:39

Si vous voulez le nombre d'occurrences par fichier (exemple pour la chaîne "tcp"):

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

Exemple de sortie:

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

Explication:

  • grep -RIci NEEDLE . - Recherche récursivement L'aiguille de chaîne à partir du répertoire courant (en suivant les liens symboliques), en ignorant les binaires, en comptant le nombre d'occurrences, en ignorant la casse
  • awk ... - Cette commande ignore les fichiers avec zéro occurrences et met en forme les lignes
  • sort -hr - trie les lignes dans l'ordre inverse par numéro dans la première colonne
2
répondu Ohne Kleidung 2018-04-30 15:35:07

Seule solution Grep que j'AI testée avec grep pour windows:

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

Cette solution comptera toutes les occurrences même s'il y en a plusieurs sur une ligne. -r Recherche récursivement dans le répertoire, -o" affichera seulement la partie d'un modèle de correspondance de ligne " - c'est ce qui divise plusieurs occurrences sur une seule ligne et fait imprimer chaque correspondance sur une nouvelle ligne; puis rediriger ces résultats séparés par une nouvelle ligne dans grep avec -c pour compter le nombre d'occurrences en utilisant modèle.

1
répondu Quantic 2015-12-15 19:48:38

Voici une autre façon de faire AWK plus rapide que grep, qui gère plusieurs correspondances de <url> par ligne, dans une collection de fichiers XML dans un répertoire:

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

Cela fonctionne bien dans les cas où certains fichiers XML n'ont pas de sauts de ligne.

1
répondu Excalibur 2017-06-18 08:27:12

Vous pouvez utiliser un simple grep pour capturer efficacement le nombre d'occurrences. Je vais utiliser l'option -i pour m'assurer que STRING/StrING/string est capturé correctement.

Ligne de commande qui donne le nom des fichiers:

grep -oci string * | grep -v :0

Ligne de commande qui supprime les noms de fichiers et affiche 0 s'il y a un fichier sans occurrences:

grep -ochi string *
1
répondu Mitul Patel 2017-06-18 08:28:19

Un autre oneliner utilisant des fonctions de ligne de commande de base gérant plusieurs occurrences par ligne.

 cat * |sed s/string/\\\nstring\ /g |grep string |wc -l
0
répondu NTwoO 2014-10-29 17:21:02