408 votes

Comment puis-je formater la sortie de grep pour afficher les numéros de ligne à la fin de la ligne, ainsi que le nombre d'occurrences ?

J'utilise grep pour faire correspondre des chaînes de caractères dans un fichier. Voici un exemple de fichier :

example one,
example two null,
example three,
example four null,

grep -i null myfile.txt renvoie à

example two null,
example four null,

Comment puis-je retourner les lignes correspondantes avec leur numéro de ligne comme ceci :

  example two null, - Line number : 2
  example four null, - Line number : 4
  Total null count : 2

Je sais que -c renvoie le total des lignes correspondantes, mais je ne sais pas comment le formater correctement pour y ajouter total null count devant, et je ne sais pas comment ajouter les numéros de ligne.

Qu'est-ce que je peux faire ?

647voto

dogbane Points 85749

-n renvoie le numéro de ligne.

-i est pour ignore-case. À n'utiliser que si la correspondance entre les cas n'est pas nécessaire.

$ grep -in null myfile.txt

2:example two null,
4:example four null,

Combinez avec awk pour imprimer le numéro de ligne après la correspondance :

$ grep -in null myfile.txt | awk -F: '{print $2" - Line number : "$1}'

example two null, - Line number : 2
example four null, - Line number : 4

Utilisez la substitution de commande pour imprimer le nombre total de nullités :

$ echo "Total null count :" $(grep -ic null myfile.txt)

Total null count : 2

0 votes

Puis-je formater ceci en ajoutant les numéros de ligne après au lieu d'avant avec : ?

0 votes

Votre solution semble bonne mais je reçois une erreur awk95: syntax error at source line context is >>> ' <<< missing } awk95: bailing out at source line 1

0 votes

Désolé, je suis passé à linux et maintenant ça marche :) c'était la version Windows qui n'était pas si bonne.

61voto

Andy Lester Points 34051

Utilisez -n ou --line-number .

Vérifiez man grep pour de nombreuses autres options.

3 votes

Le nouvel utilisateur de linux a la flemme de lire les pages de manuel. Mais s'ils utilisent suffisamment linux, ils s'y habitueront :) C'est super utile :)

22 votes

Pas toujours paresseux, (mais parfois), c'est souvent qu'un nouvel utilisateur de Linux a du mal à comprendre une page de manuel. (Ils peuvent semblent cryptique)

0 votes

Parfois, une page de manuel peut prendre plusieurs pages. Et il est difficile de les lire toutes

7voto

Zsolt Botykai Points 20615

Ou utilisez awk à la place :

awk '/null/ { counter++; printf("%s%s%i\n",$0, " - Line number: ", NR)} END {print "Total null count: " counter}' file

7voto

WakiMiko Points 378

Utiliser grep -n -i null myfile.txt pour afficher le numéro de ligne devant chaque correspondance.

Je ne pense pas que grep ait un commutateur pour imprimer le nombre total de lignes correspondantes, mais vous pouvez simplement passer la sortie de grep dans wc pour accomplir cela :

grep -n -i null myfile.txt | wc -l

4 votes

-c imprimera le total des lignes correspondantes

0 votes

Vous avez raison. Malheureusement, cela supprime aussi la production normale.

4voto

ghostdog74 Points 86060

grep trouve les lignes et affiche les numéros de ligne, mais ne vous permet pas de "programmer" d'autres choses. Si vous voulez inclure du texte arbitraire et faire d'autres "programmations", vous pouvez utiliser awk,

$ awk '/null/{c++;print $0," - Line number: "NR}END{print "Total null count: "c}' file
example two null,  - Line number: 2
example four null,  - Line number: 4
Total null count: 2

Ou en utilisant uniquement le shell(bash/ksh)

c=0
while read -r line
do
  case "$line" in
   *null* )  (
    ((c++))
    echo "$line - Line number $c"
    ;;
  esac
done < "file"
echo "total count: $c"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X