chat * | grep quelque chose… dans quel fichier est le résultat?

8

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' -Hoption pour grep qui, selon mandit, print the filename for each matchmais dans ma coquille, il dit juste

(standard input):$DATABASE_FUNCTION = dothis();
Jake Wilson
la source
bonne question. J'essaye toujours de casser le chat -> l'habitude de grep moi-même. :)
Sirex

Réponses:

22

N'utilisez pas de chat pour ça. Utilisez plutôt grep DATABASE *ou grep -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, -Hest 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.

Eduardo Ivanec
la source
6

Utilisation grep -H DATABASE *(remarque: s'il y a plus d'un fichier dans le répertoire, le -Hest 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 de grep 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.

Gordon Davisson
la source