Afficher le nom de fichier et le numéro de ligne dans la sortie grep

87

J'essaye de rechercher mon répertoire de rails en utilisant grep. Je recherche un mot spécifique et je veux grep pour imprimer le nom du fichier et le numéro de ligne.

Y a-t-il un drapeau grep qui fera cela pour moi? J'ai essayé d'utiliser une combinaison de -net, -lmais ceux-ci impriment les noms de fichiers sans numéros ou déchargent simplement beaucoup de texte sur le terminal qui ne peut pas être facilement lu.

ex:

  grep -ln "search" *

Dois-je le canaliser vers awk?

trev9065
la source

Réponses:

138

Je pense que -lc'est trop restrictif car il supprime la sortie de -n. Je suggérerais -H( --with-filename): Imprimez le nom de fichier pour chaque correspondance.

grep -Hn "search" *

Si cela donne trop de résultats, essayez -ode n'imprimer que la partie qui correspond.

grep -nHo "search" * 
porte-parole
la source
Cette réponse a fonctionné aussi pour moi. J'avais besoin d'une recherche récursive et j'ai utilisé cet exemple de commande: grep -Hnor "localhost". Cette liste répertorie toutes les correspondances avec le nom de fichier et le numéro de ligne, court et concis.
Tore Aurstad
Cela affiche également le résultat et pas seulement le nom de fichier et le numéro de ligne
élig
30
grep -rin searchstring * | cut -d: -f1-2

Cela voudrait dire, rechercher récursivement (pour la chaîne searchstringdans cet exemple), en ignorant la casse et afficher les numéros de ligne. La sortie de ce grep ressemblera à quelque chose comme:

/path/to/result/file.name:100: Line in file where 'searchstring' is found.

Ensuite, nous dirigeons ce résultat vers la commande cut en utilisant deux points :comme séparateur de champ et en affichant les champs 1 à 2.

Lorsque je n'ai pas besoin des numéros de ligne que j'utilise souvent -f1(juste le nom de fichier et le chemin), puis dirigez la sortie vers uniq, de sorte que je ne vois chaque nom de fichier qu'une fois:

grep -ir searchstring * | cut -d: -f1 | uniq
JBW
la source
1
Je pense que cela répond le mieux à la question initiale. Noms de fichier et numéros de ligne uniquement.
mastaBlasta
1
Notez que cela ne fonctionne pas si vous avez des noms de chemin absolus de Windows comme `C: \ Users \ me \ git` car il contient déjà un deux-points.
hirse
19

J'aime utiliser:

grep -niro 'searchstring' <path>

Mais c'est juste parce que j'oublie toujours les autres moyens et que je ne peux pas oublier Robert de grep -niro pour une raison quelconque :)

Bas van Ommen
la source
Je n'aurais jamais pensé obtenir des votes positifs pour ce qui précède. Juste un partage amusant. Merci! (Mais ça marche vraiment - au moins sur MacOS)
Bas van Ommen
Aimez votre façon de vous en souvenir!
Greg Hilston
0

Le commentaire de @ToreAurstad peut être épelé grep -Horn 'search' ./, ce qui est plus facile à retenir.

grep -HEroine 'search' ./ pourrait aussi fonctionner;)

Pour les curieux:

$ grep --help | grep -Ee '-(H|E|r|o|i|n|e),'
  -E, --extended-regexp     PATTERNS are extended regular expressions
  -e, --regexp=PATTERNS     use PATTERNS for matching
  -i, --ignore-case         ignore case distinctions
  -n, --line-number         print line number with output lines
  -H, --with-filename       print file name with output lines
  -o, --only-matching       show only nonempty parts of lines that match
  -r, --recursive           like --directories=recurse
Ictus
la source
0

Voici comment j'ai utilisé la réponse votée pour rechercher un arbre afin de trouver les fichiers fortran contenant une chaîne:

find . -name "*.f" -exec grep -nHo the_string {} \;

Sans le nHo, vous apprenez seulement que certains fichiers, quelque part, correspondent à la chaîne.

Karl I.
la source