355 votes

Afficher le nom du fichier avant la ligne correspondante

Comment puis-je obtenir grep pour afficher le nom du fichier avant les lignes correspondantes dans sa sortie ?

2 votes

S'il vous plaît dites votre version de grep grep --version

3 votes

Kent, grep --version Est-ce la commande à utiliser pour connaître la version de grep ? Si oui, cela ne fonctionne pas. Je n'ai pas trouvé d'autre commande pour connaître la version de grep.

2 votes

Bonne question mais 'Os version' est un exemple de nom de fichier qui prête à confusion.

522voto

Scrutinizer Points 3311

Essayez ce petit truc pour amadouer grep en pensant qu'il s'agit de plusieurs fichiers, de sorte qu'il affiche le nom du fichier :

grep 'pattern' file /dev/null

Pour obtenir également le numéro de ligne :

grep -n 'pattern' file /dev/null

9 votes

Oui, ça a marché. Pouvez-vous s'il vous plaît me dire ce que signifie l'ajout de /dev/null dans cette commande ?

66 votes

Si grep est fourni avec plusieurs noms de fichiers, il affichera automatiquement les noms de fichiers avant la correspondance, mais il laissera le nom de fichier en dehors dans le cas d'un seul fichier d'entrée. En utilisant /dev/null comme un fichier d'entrée supplémentaire grep "pense qu'il s'agit de plusieurs fichiers, mais /dev/null est bien sûr vide, donc il n'apparaîtra pas dans la liste des correspondances

36 votes

L'utilisation de /dev/null est une astuce intelligente, mais je pense que la suggestion ci-dessous de l'indicateur -H est une meilleure réponse.

368voto

iiSeymour Points 34967

Si vous avez les options -H y -n disponible ( man grep est votre ami) :

$ cat file
foo
bar
foobar

$ grep -H foo file
file:foo
file:foobar

$ grep -Hn foo file
file:1:foo
file:3:foobar

Options :

-H, --with-filename

Imprimez le nom du fichier pour chaque correspondance. C'est la valeur par défaut lorsqu'il y a plus d'un fichier à recherche.

-n, --nombre de lignes

Préfixe chaque ligne de sortie avec le numéro de ligne basé sur 1. fichier d'entrée. (-n est spécifié par POSIX).

-H est une extension GNU, mais -n es spécifié par POSIX

3 votes

Non, -H n'est pas pris en charge ici.

1 votes

Prise en charge mais cela donne toujours grep : file : Aucun fichier ou répertoire de ce type

2 votes

Fonctionne sur ubuntu -H et -n. Probablement avec toutes les nouvelles versions de *nix.

62voto

MD XF Points 7062

Aucune astuce n'est nécessaire.

grep --with-filename 'pattern' file

Avec des numéros de ligne :

grep -n --with-filename 'pattern' file

7voto

Lejuanjowski Points 109

Que pensez-vous de ceci, que j'ai réussi à réaliser grâce, en partie, à ce billet.

Vous voulez trouver plusieurs fichiers, disons des journaux avec des noms différents mais avec un modèle (par ex. filename=logfile.DATE ), à l'intérieur de plusieurs répertoires avec un motif (par ex. /logsapp1, /logsapp2 ). Chaque fichier possède un motif que vous voulez grep (par exemple "init time" ), et vous voulez que le "init time" de chaque fichier, mais en sachant à quel fichier il appartient.

find ./logsapp* -name logfile* | xargs -I{} grep "init time" {} \dev\null | tee outputfilename.txt

Ensuite, le outputfilename.txt serait quelque chose comme

./logsapp1/logfile.22102015: init time: 10ms
./logsapp1/logfile.21102015: init time: 15ms
./logsapp2/logfile.21102015: init time: 17ms
./logsapp2/logfile.22102015: init time: 11ms

En général

find ./path_pattern/to_files* -name filename_pattern* | xargs -I{} grep "grep_pattern" {} \dev\null | tee outfilename.txt

Explication :

find recherchera les noms de fichiers basés sur le modèle

ensuite, le tuyau xargs -I{} redirigera le find la sortie vers le {}

qui sera l'entrée pour grep ""pattern" {}

Alors l'astuce pour faire grep afficher les noms de fichiers \dev\null

et enfin, écrire la sortie dans un fichier avec tee outputfile.txt

Cela a fonctionné pour moi dans grep version 9.0.5 build 1989.

1voto

Richard Jessop Points 150

Il s'agit d'une légère modification d'une solution précédente. Mon exemple recherche la redirection de stderr dans bash scripts : grep '2>' $(find . -name "*.bash")

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X