2010-10-19 17 views
269

J'utilise grep pour faire correspondre une chaîne dans un fichier. Voici un exemple de fichier:Comment puis-je formater ma sortie grep pour afficher les numéros de ligne à la fin de la ligne, ainsi que le nombre de hits?

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

grep -i null myfile.txt retours

example two null, 
example four null, 

Comment comme cela, je retourner les lignes correspondantes ainsi que leurs numéros de ligne:

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

Je sais rendements -c Total des paris égalés lignes, mais je ne sais pas comment le formater correctement pour ajouter total null count à l'avant, et je ne sais pas comment ajouter les numéros de ligne.

Que puis-je faire?

Répondre

434

-n renvoie le numéro de ligne.

-i est pour ignore-case. A utiliser uniquement si la correspondance de cas n'est pas nécessaire

$ grep -in null myfile.txt 

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

Combine avec awk pour 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 

substitution de commande Utilisez pour imprimer le nombre total de null:

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

Total null count : 2 
+0

puis-je formater ceci en ajoutant des numéros de ligne après au lieu de avant avec:? – London

+1

Bien sûr, j'ai mis à jour ma réponse. – dogbane

+0

votre solution semble bien, mais obtenir une erreur 'awk95: erreur de syntaxe à la ligne source contexte est >>> '<<< manquant} awk95: videur sur la ligne source 1' – London

38

Utilisez -n ou --line-number.

Consultez man grep pour plus d'options.

+2

nouvel utilisateur linux est paresseux de la page man de lecture. Mais s'ils utilisent assez Linux, ils seront habitués :) C'est super utile :) – nXqd

+11

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

5

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

Je ne pense pas que grep a un commutateur d'imprimer le nombre de lignes correspondantes au total, mais vous pouvez simplement la sortie du tuyau grep dans wc pour y parvenir:

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

-c va imprimer le total des lignes correspondant – dpatchery

+0

Vous avez raison. Malheureusement, il supprime également la sortie normale. – WakiMiko

3

grep trouver les lignes et sortie les numéros de ligne, mais ne vous laisse pas "programmer" d'autres choses. Si vous voulez inclure du texte arbitraire et faire d'autres "programmation", 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 seulement en utilisant 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" 
6

Ou utilisez awk à la place:

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

ou en perl (pour l'exhaustivité ...):

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

Référez ce lien pour la commande linux linux http://linuxcommand.org/man_pages/grep1.html

pour afficher la ligne non, ligne de code et de l'utilisation de fichiers cette commande dans votre terminal ou cmd, GitBash (alimenté par le terminal)

grep -irn "YourStringToBeSearch"