Si l'on devait exécuter la commande suivante
cat * | grep DATABASE
le shell cracherait toutes les lignes des fichiers * contenant le mot DATABASE
. Existe-t-il un moyen de cracher également de quel fichier chaque ligne est séparée?
J'ai essayé d'utiliser l' -H
option pour grep qui, selon man
dit, print the filename for each match
mais dans ma coquille, il dit juste
(standard input):$DATABASE_FUNCTION = dothis();
Réponses:
N'utilisez pas de chat pour ça. Utilisez plutôt
grep DATABASE *
ougrep -n DATABASE *
(si vous voulez connaître les numéros de ligne ainsi que les noms de fichiers) directement.Voir l' utilisation inutile du chat .
Pour clarifier un peu plus:
cat *
concatène en fait tous les fichiers en les alimentant à grep par le biais du canal, donc grep n'a aucun moyen de savoir quel contenu appartient à quel fichier, et ne peut même pas vraiment savoir s'il analyse des fichiers ou si vous êtes il suffit de taper très vite. C'est tout un gros flux d'entrée standard une fois que vous utilisez un tuyau.Enfin,
-H
est redondant presque à coup sûr car grep imprime le nom de fichier par défaut lorsqu'il a plus d'un fichier à rechercher. Cependant, cela pourrait être utile si vous souhaitez analyser la sortie, car il est possible que le*
glob se développe en un seul fichier et que grep omet dans ce cas le nom de fichier.la source
Utilisation
grep -H DATABASE *
(remarque: s'il y a plus d'un fichier dans le répertoire, le-H
est facultatif).Le problème que vous rencontrez est qu'avec votre commande,
cat *
concatène tous les fichiers ensemble dans un gros gâchis, puis|
envoie cela dans l'entrée standard degrep DATABASE
. Au moment où grep voit les données, les informations sur leur provenance ont été perdues. La solution est de demander à grep de parcourir les fichiers individuels, donc quand il trouve une correspondance, il sait de quel fichier il provient.la source