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

378

J'utilise grep pour faire correspondre la chaîne dans un fichier. Voici un exemple de fichier:

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

grep -i null myfile.txt Retour

example two null,
example four null,

Comment puis-je renvoyer les lignes correspondantes avec leurs numéros 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 nombre total de lignes correspondantes, mais je ne sais pas comment le formater correctement pour l'ajouter total null countdevant, et je ne sais pas comment ajouter les numéros de ligne.

Que puis-je faire?

Londres
la source

Réponses:

600

-n renvoie le numéro de ligne.

-iest pour ignore-case. À utiliser uniquement si la correspondance de casse n'est pas nécessaire

$ grep -in null myfile.txt

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

Combinez avec awkpour imprimer le numéro de ligne après le match:

$ 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 nul total:

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

Total null count : 2
dogbane
la source
puis-je formater cela en ajoutant des numéros de ligne après au lieu d'avant avec:?
Londres
votre solution semble correcte mais obtenez une erreurawk95: syntax error at source line context is >>> ' <<< missing } awk95: bailing out at source line 1
Londres
désolé passé à linux maintenant son fonctionnement :) c'était la version windows pas si bonne
Londres
1
... les chevaliers qui disent -nique vous vous souvenez de cette astuce
santiago arizti
59

Utilisez -nou --line-number.

Découvrez man grepbeaucoup plus d'options.

Andy Lester
la source
3
un nouvel utilisateur linux est paresseux de lire la page de manuel. Mais s'ils utilisent suffisamment Linux, ils y seront habitués :) C'est super utile :)
Dzung Nguyen
19
Pas toujours paresseux, (mais parfois), c'est souvent qu'un nouvel utilisateur Linux a du mal à comprendre une page de manuel. (Ils peuvent sembler énigmatiques)
TecBrat
parfois, la page de manuel peut prendre plusieurs pages. Et c'est difficile de les lire tous
Eugen Konkov
7

Utilisez grep -n -i null myfile.txtpour afficher le numéro de ligne devant chaque correspondance.

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

grep -n -i null myfile.txt | wc -l
jhenninger
la source
3
-c affichera le nombre total de lignes appariées
dpatchery
Tu as raison. Malheureusement, il supprime également la sortie normale.
jhenninger
7

Ou utilisez awkplutôt:

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

greptrouver les lignes et sortir 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"
ghostdog74
la source
3

ou en perl (pour être complet ...):

perl -npe 'chomp; /null/ and print "$_ - Line number : $.\n" and $i++;$_="";END{print "Total null count : $i\n"}'
hannes
la source
2

Reportez-vous à ce lien pour la commande linux linux http://linuxcommand.org/man_pages/grep1.html

pour afficher la ligne no, la ligne de code et le fichier, utilisez cette commande dans votre terminal ou cmd, GitBash (Propulsé par le terminal)

grep -irn "YourStringToBeSearch"
Vrushal Raut
la source
1

Je pensais juste que je pourrais vous aider à l'avenir. Pour rechercher plusieurs chaînes et numéros de ligne de sortie et parcourir la sortie, tapez:

egrep -ne 'null|three'

montrera:

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

egrep -ne 'null|three' | less

affichera la sortie dans une session moins

HTH Jun

Honnête Abe
la source