2017-08-23 1 views

Répondre

1

avec awk:

grep 'test' testdoc|awk 'END{print NR}1' 

En awk, est toujours vraie, il effectue une opération par défaut {print $0} - imprime la ligne courante stockée dans $0

NR est le nombre de enregistrement/ligne en cours et dans END block (ou sur la dernière ligne du fichier) est-ce le nombre de lignes dans le fichier.

END Le bloc s'exécute après l'exécution de tous les codes awk. donc c'est le dernier code awk qui va s'exécuter.

+0

Vous êtes les bienvenus. Si cela vous a aidé, vous pouvez accepter (et augmenter) ma réponse.^_^ – tso

+0

@tso: Pourriez-vous s'il vous plaît expliquer la partie 'awk 'END {print NR} 1''? – User123

+0

mise à jour de la réponse, explication ajoutée – tso

1

Comme ceci:

grep pattern file | tee >(wc -l) 

tee imprime toutes les lignes grep trouvées, puis les transmet également à un processus qui compte les lignes. C'est comme un joint T dans la plomberie, où l'eau vient d'un côté et sort deux autres - c'est-à-dire un séparateur.

Notez que ceci est appelé « substitution de processus » et est une construction bash et il n'y a Spécifiques pas d'espace entre > et (.


Vous pouvez aussi le faire avec awk comme ceci:.

awk '/pattern/{print;n++} END{print n+0}' file 

Cela dit ... « Si la ligne correspond pattern, l'imprimer et incrémenter n A la fin, l'impression n - après avoir ajouté zéro pour s'assurer qu'il s'agit d'un nombre et non d'une chaîne vide s'il n'y a pas de correspondance."

+0

Marque de remerciements. Mais obtenir l'erreur suivante. "Nom manquant pour la redirection" –

+0

Utilisez-vous 'bash'? Avez-vous sorti des espaces supplémentaires dans ma commande peut-être? –

1
grep 'test' testdoc|wc -l 

compte le nombre de lignes où votre modèle se produit et il est équivalent à

grep -c 'test' testdoc 

Pour prendre en compte plusieurs correspondances par ligne, utilisez l'option -o

grep -o 'test' testdoc|wc -l 

Pour obtenir les deux lignes et compter, vous pouvez utiliser tee en sortie dans un fichier temporaire f et ajouter à f le résultat de la deuxième grep:

grep "test" testdoc |tee >(wc -l 1>&f)|grep -o "test"|wc -l 1>>f && cat f 

# or to get both outputs in a line: 
grep "test" testdoc |tee >(wc -l|tr '\n' ' ' 1>&f)|grep -o "test"|wc -l 1>>f && cat f 

Voici une autre solution de ne pas utiliser grep (puisque dans certaines distributions -o l'option est manquante)

awk 'BEGIN{lCount=0;count=0}{c=gsub(/test/,"");count+=c;if(c)lCount+=1;}END{print(lCount,count)}' testdoc