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 un 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
se rapproche le plus, je pense, mais affiche toujours le match.
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, par exemple, dans les fichiers source javascript minifiés.)Réponses:
essayer:
la source
-f
param. Pour moi, ça l'était-f2
. (Sachez que c'est du vieux truc, mais je pense que cela pourrait aider certaines pauvres âmes)grep -n "text to find" file.ext | cut -f1,2 -d:
affiche le nom du fichier et le numéro de ligne.-H
pour le forcer à afficher le nom de fichier lorsqu'il n'y a qu'un seul fichier. Inversement, vous pouvez toujours utiliser-h
pour lui dire de ne pas afficher le nom de fichier, quel que soit le nombre de fichiers que vous greffe.Si vous êtes prêt à utiliser AWK:
Dans ce cas, FNR est le numéro de ligne. AWK est un excellent outil lorsque vous regardez grep | cut, ou chaque fois que vous cherchez à prendre une sortie grep et à la manipuler.
la source
NR
fonctionne aussi bien lorsqu'il n'y a qu'un seul fichier en cours d'examen, comme dans ce cas.Toutes ces réponses nécessitent grep pour générer toutes les lignes correspondantes, puis les diriger vers un autre programme. Si vos lignes sont très longues, il peut être plus efficace d'utiliser juste sed pour afficher les numéros de ligne:
la source
Version bash
la source
Je recommande les réponses avec
sed
etawk
pour obtenir simplement le numéro de ligne, plutôt que d'utilisergrep
pour obtenir toute la ligne correspondante, puis de la supprimer de la sortie aveccut
ou un autre outil. Pour être complet, vous pouvez également utiliser Perl:ou Ruby:
la source
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:
la source
Pour compter le nombre de lignes correspondant au motif:
Pour extraire le motif correspondant
Pour afficher les numéros de ligne sur lesquels le motif a été mis en correspondance
la source
en utilisant uniquement grep :
grep -n "text to find" file.ext | grep -Po '^[^:]+'
la source