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 *
Retour
...
file1:1
file2:0
file3:0
...
En utilisant un canal, 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 revient file4:5, file5:1, file6:2
, je veux en revenir 8.)
grep file1 file2 --options
Réponses:
la source
grep -c string<*
remplaçant simplement l'espace par un moins de.grep -o
etwc -l
. le chat est plus rapide dans des cas comme la question d'origine.Cela fonctionne pour plusieurs occurrences par ligne:
la source
grep -o string * --exclude-dir=some/dir/one/ --exclude-dir=some/dir/two | wc -l
.grep -ioR string * | wc -l
est ce que j'utilise pour faire une recherche insensible à la casse, récursive et par correspondance uniquementgrep -rc test . | awk -F: '$NF > 0 {x+=$NF; $NF=""; print} END{print "Total:",x}'
comptera plusieurs occurrences dans une ligne
la source
grep -oh "... my that curry was strong" * >> wc
:)Au lieu d'utiliser -c, dirigez-le simplement vers wc -l.
Cela répertoriera chaque occurrence sur une seule ligne, puis comptera le nombre de lignes.
Cependant, cela manquera les cas où la chaîne se produit 2 fois ou plus sur une même ligne.
la source
L'une des rares applications utiles de
cat
.la source
Quelque chose de différent de toutes les réponses précédentes:
la source
Vous pouvez ajouter
-R
à la recherche récursivement (et éviter d'utiliser cat) et-I
ignorer les fichiers binaires.la source
Solution AWK obligatoire:
Attention cependant si les noms de vos fichiers contiennent ":".
la source
La solution AWK qui gère également les noms de fichiers, y compris les deux-points:
Gardez à l'esprit que cette méthode ne trouve toujours pas plusieurs occurrences de
string
sur la même ligne.la source
Si vous souhaitez un nombre d'occurrences par fichier (exemple pour la chaîne "tcp"):
Exemple de sortie:
Explication:
grep -RIci NEEDLE .
- recherche la chaîne NEEDLE de manière récursive à partir du répertoire courant (suivant les liens symboliques), en ignorant les binaires, en comptant le nombre d'occurrences, en ignorant la casseawk ...
- cette commande ignore les fichiers avec zéro occurrence et formate les lignessort -hr
- trie les lignes dans l'ordre inverse par des nombres dans la première colonneBien sûr, cela fonctionne également avec d'autres commandes grep avec l'option
-c
(count). Par exemple:la source
Vous pouvez utiliser un simple
grep
pour capturer efficacement le nombre d'occurrences. J'utiliserai l'-i
option pour m'assurer d'STRING/StrING/string
être correctement capturé.Ligne de commande qui donne le nom des fichiers:
Ligne de commande qui supprime les noms de fichiers et affiche 0 s'il y a un fichier sans occurrence:
la source
variante récursive courte :
la source
Grep seule solution que j'ai testée avec grep pour windows:
Cette solution comptera toutes les occurrences même s'il y en a plusieurs sur une même ligne.
-r
recherche récursivement dans le répertoire,-o
"n'affichera que la partie d'une ligne correspondant au MOTIF" - c'est ce qui divise plusieurs occurrences sur une seule ligne et fait grep imprimer chaque correspondance sur une nouvelle ligne; redirigez ensuite ces résultats séparés par des sauts de ligne dans grep avec-c
pour compter le nombre d'occurrences en utilisant le même modèle.la source
Voici une autre façon de procéder AWK plus rapide que grep, qui gère plusieurs correspondances
<url>
par ligne, dans une collection de fichiers XML dans un répertoire:Cela fonctionne bien dans les cas où certains fichiers XML n'ont pas de sauts de ligne.
la source
Un autre oneliner utilisant des fonctions de ligne de commande de base gérant plusieurs occurrences par ligne.
la source