Comment puis-je récursivement searchr des directorys pour un model et il suffit d'imprimer les noms de files et les numéros de ligne

Actuellement, j'utilise grep comme suit:

grep -lr <PATTERN> . 

Cela me donne la sortie suivante, contenant une list de tous les files dont le contenu (pas le nom) contient:

 ./path/to/file1 ./path/to/file2 ... 

C'est correct mais connaître les numéros de ligne serait utile. La sortie suivante serait idéale mais après avoir parcouru la page man pour grep, je n'arrive pas à find les bons commutateurs:

 ./path/to/file1 15, 22, 54 ./path/to/file2 16, 17 ... 

Est-ce possible avec grep ou un autre outil?

ack fait quelque chose de similaire par défaut. vous pouvez utiliser

 $ ack blah path/to/blah 16: blah blah 19: blah blah blah path/to/more/blah 21: blahness 

Si vous voulez simplement que les noms de file correspondent, vous pouvez dire ack -l . ack -lc vous donnera le nombre de correspondances par file.

Grep a des options pour imprimer simplement les noms de files, ou simplement les noms de files et les counts de correspondance, ou les lignes correspondantes (éventuellement avec les noms de files et les numéros de ligne), mais pas pour condenser plusieurs correspondances sur une seule ligne.

Vous pouvez filterr la sortie grep ou utiliser un autre outil tel que awk.

 find . -type f -exec awk 'FNR==1 {if (found) print ""; found=0} /PATTERN/ { if (!found) printf("%s", FILENAME); printf(" %d", FNR); found=1 } END {if (found) print ""}' {} + 
 grep -rins <pattern> * 

Cela fait-il ce que vous cherchez?

Dans le cas où vous avez un pattern plus complexe, par exemple lors de l'utilisation de egrep , il peut être utile d'utiliser egrep -rinos <pattern> * place.

Pour augmenter encore la lisibilité, ajoutez --color à la list des parameters. Personnellement, j'ai cela dans mon .zshrc :

 export GREP_OPTIONS="--color" 

si vous voulez searchr un tree complet, essayez

 find . -exec grep -n blah {} /; -ls 

ou fait semblable

 find . -exec grep -n blah {} /; -print 

La balise -H grep inclut le nom de file, la balise -n de grep imprime le numéro de ligne. Si vous souhaitez uniquement répertorier la première correspondance et le nom de file, vous pouvez utiliser -l .
Pour exclure des informations supplémentaires, vous pouvez canaliser vers sed en obtenant à la fois le numéro de ligne et le nom de file que vous pouvez canaliser vers sed .