Comment puis-je obtenir grep
pour afficher le nom du fichier avant les lignes correspondantes dans sa sortie ?
Oui, ça a marché. Pouvez-vous s'il vous plaît me dire ce que signifie l'ajout de /dev/null
dans cette commande ?
Comment puis-je obtenir grep
pour afficher le nom du fichier avant les lignes correspondantes dans sa sortie ?
Oui, ça a marché. Pouvez-vous s'il vous plaît me dire ce que signifie l'ajout de /dev/null
dans cette commande ?
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
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.
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
Prise en charge mais cela donne toujours grep : file : Aucun fichier ou répertoire de ce type
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.
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.
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.
1 votes
Le système d'exploitation et la version ne sont pas pertinents ici.
0 votes
grep 'pattern' *