111 votes

Utilisez grep pour rapporter uniquement les numéros de ligne

J'ai un fichier qui contient peut-être un mauvais formatage (dans ce cas, l'occurrence du motif \\backslash ). Je voudrais utiliser grep pour ne renvoyer que les numéros de ligne où cela se produit (comme dans, la correspondance était ici, allez à la ligne # x et corrigez-la).

Cependant, il ne semble pas y avoir de moyen d'imprimer le numéro de ligne ( grep -n ) et non la correspondance ou la ligne elle-même.

Je peux utiliser une autre regex pour extraire les numéros de ligne, mais je veux m'assurer que grep ne peut pas le faire tout seul. grep -no s'en approche le plus, je pense, mais affiche quand même la correspondance.

1 votes

La réponse la plus utile pour moi se trouvait dans la question : grep -no ! Cela a fait ce que je suis venu ici pour essayer de faire ! (c'est-à-dire ne pas imprimer la ligne qui est parfois très longue dans, par exemple, les fichiers sources de javascript minifiés).

172voto

love_me_some_linux Points 815

Essayez :

grep -n "text to find" file.ext | cut -f1 -d:

1 votes

Sur ma machine, cela n'imprime que les fichiers correspondants sans numéro de ligne (donc si j'ai 3 correspondances dans un fichier, elles ne sont imprimées qu'une fois), ce qui est quand même très utile...

3 votes

@MarioAwad, vous devriez manipuler -f param. Pour moi, c'était -f2 . (Je sais que c'est un vieux truc, mais je pense que ça pourrait aider quelques pauvres âmes)

0 votes

Merci pour le bon vieux script shell adhoc unix. cela montre que les outils flexibles valent leur complexité et leur courbe d'apprentissage !

48voto

brightlancer Points 939

Si vous êtes prêt à utiliser AWK :

awk '/textstring/ {print FNR}' textfile

Dans ce cas, FNR est le numéro de la ligne. AWK est un outil formidable lorsque vous regardez grep|cut, ou à chaque fois que vous cherchez à prendre la sortie de grep et à la manipuler.

3 votes

Utilise un seul processus (ce qui était plus important dans le passé, mais quand même), et assez facile à comprendre pour les débutants en awk !

0 votes

NR fonctionne aussi bien quand il n'y a qu'un seul fichier à examiner, comme dans ce cas.

0 votes

Tout simplement génial ! C'est tellement rapide !

39voto

maverick Points 919

Toutes ces réponses nécessitent que grep génère l'ensemble des lignes correspondantes, puis les transmette à un autre programme. Si vos lignes sont très longues, il peut être plus efficace d'utiliser simplement sed pour afficher les numéros de ligne :

sed -n '/pattern/=' filename

2voto

maverick Points 919

Version Bash

    lineno=$(grep -n "pattern" filename)
    lineno=${lineno%%:*}

1 votes

Et que se passe-t-il si plus d'une ligne correspond à ce modèle ?

0 votes

@izabera add | tail -1

0voto

user2059931 Points 11

Vous allez vouloir le deuxième champ après les deux points, pas le premier.

grep -n "text to find" file.txt | cut -f2 -d:

0 votes

Cela fonctionne si vous voulez faire correspondre le texte, mais dans ce cas, le numéro de ligne est ce que le PO demandait.

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