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 -n
et, -l
mais 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?
Réponses:
Je pense que
-l
c'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
-o
de n'imprimer que la partie qui correspond.grep -nHo "search" *
la source
grep -rin searchstring * | cut -d: -f1-2
Cela voudrait dire, rechercher récursivement (pour la chaîne
searchstring
dans 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 versuniq
, de sorte que je ne vois chaque nom de fichier qu'une fois:grep -ir searchstring * | cut -d: -f1 | uniq
la source
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 :)la source
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
la source
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.
la source