2009-07-05 6 views
3

Pour voir tous les fichiers php qui contiennent « abc » Je peux utiliser ce script simple:Ecrire un script shell qui trouve-greps et sorties nom de fichier et le contenu en 1 ligne

find . -name "*php" -exec grep -l abc {} \; 

je peux omettre le -l et je me extrait une partie du contenu au lieu des noms de fichiers comme résultats:

find . -name "*php" -exec grep abc {} \; 

ce que je voudrais maintenant est une version qui fait les deux en même temps, mais sur la même ligne.

Résultats attendus:

path1/filename1: lorem abc ipsum 
path2/filename2: ipsum abc lorem 
path3/filename3: non abc quod 

plus ou moins comme grep abc * fait.

Édition: Je souhaite l'utiliser comme un simple script shell. Ce serait génial si la sortie est sur une ligne, donc plus de grepping serait possible. Mais il n'est pas nécessaire que le script ne soit qu'une ligne, je le mets de toute façon dans un fichier script bash.

Éditer 2: Plus tard, j'ai trouvé "ack", ce qui est un excellent outil et je l'utilise maintenant dans la plupart des cas au lieu de grep. Il fait tout cela et plus encore. http://betterthangrep.com/ Vous écririez ack --php --nogroup abc pour obtenir le résultat souhaité

Répondre

7

Utilisez l'interrupteur -H (man grep):

find . -name "*php" -exec grep -H abc {} \; 

Alternative à l'aide xargs (maintenant l'interrupteur -H n'est pas nécessaire, au moins pour la version de grep je ici):

find . -name "*php" -print | xargs grep abc 

Modifier: En conséquence du comportement de grep comme indiqué par orsogufo, la deuxième commande ci-dessus devrait utiliser -H si find pouvait éventuellement retourner un seul nom de fichier (c.-à-d. s'il n'y a qu'un seul fichier PHP). Si le commentaire d'orsogufo w.r.t. -print0 est également incorporé, la commande devient:

find . -name "*php" -print0 | xargs -0 grep -H abc 

Edit 2: A (plus) POSIX version compatible tel que proposé par Jonathan Leffler, qui, grâce à l'utilisation de /dev/null évite le commutateur -H:

find . -name "*php" -print0 | xargs -0 grep abc /dev/null 

: Une citation de la opengroup.org manual on find conseils qui -print0 est non-standard:

Une caractéristique de l'utilitaire de découverte de SVR4 WAS la terminaison du primaire exec +.Ce autorisés les noms de fichiers contenant des caractères spéciaux caractères (en particulier s) à être regroupés sans les problèmes qui se produisent si de tels noms de fichiers sont canalisés à xargs. Autres implémentations ont ajouté d'autres façons pour contourner ce problème, notamment un primaire -print0 qui a écrit des noms de fichiers avec un terminateur d'octet nul. Ceci était considéré ici, mais pas adopté. L'utilisation d'un terminateur null signifiait que tout utilitaire qui allait traiter la sortie -print0 de de find devait ajouter une nouvelle option pour analyser les terminaisons NULL qu'il allait maintenant lire.

+0

Le -H est pas nécessaire avec xargs parce que grep reçoit plus d'un fichier sur la ligne de commande, et dans ce cas il sort le nom du fichier avec la capture; Je pense que c'est un comportement standard, et devrait fonctionner aussi sur des greps différents des vôtres. Notez qu'il vaut mieux utiliser 'find ... -print0' et rediriger la sortie vers 'xargs -0', de sorte qu'un séparateur 0 est utilisé, et votre commande fonctionnera aussi avec des noms de fichiers désagréables (par exemple contenant des espaces) . –

+0

Merci pour votre commentaire. J'ai mis à jour la réponse. – Stephan202

+0

Notez que l'autre façon de traiter la possibilité qu'un fichier soit passé à grep est d'ajouter/dev/null à la commande, donc grep a toujours au moins deux fichiers à rechercher. L'option '-H' pour grep ne fait pas partie de la spécification POSIX - c'est une extension GNU utile. –

2

Si vous n'avez pas besoin de chercher récursive, vous pouvez simplement faire ..

grep -H abc *.php 

..which vous donne la sortie désirée. -H est le comportement par défaut (au moins sur la version OS X de grep), de sorte que vous pouvez omettre ceci:

grep abc *.php 

Vous pouvez grep en utilisant récursive le drapeau -R, mais vous êtes limite pas à .php fichiers:

Encore une fois, ceci a la même sortie désirée.

Je sais que cela ne répond pas exactement à vos questions, il est juste .. une alternative ... Le ci-dessus sont juste grep avec un seul drapeau, sont donc plus faciles à retenir que find/-exec/grep/xargs combinaisons! (Hors de propos pour un script, mais utile pour le jour le jour shell'ing)

1
find /path -type f -name "*.php" | awk ' 
{ 
    while((getline line<$0)>0){ 
     if(line ~ /time/){ 
      print $0":"line 
      #do some other things here 
     } 
    }  
}' 
Questions connexes