Avantages de cat'ing file et piping to grep

19

Y a-t-il des avantages supplémentaires à gérer un fichier et à le rediriger vers grep, en plus de la commodité? La commodité étant que, lorsque je récupère des commandes telles que celles ci-dessous de mon historique, le curseur se trouve à la fin de la ligne, il est donc facile de modifier la commande avec un texte différent pour effectuer une grep contre le même fichier.

Alors, quels autres avantages pourrait-il y avoir à la convention suivante:

cat /var/tmp/trace.2043925204.xt | grep -in profile
cat /var/tmp/trace.2043925204.xt | grep -n Profile-Main

au lieu de:

grep -in profile /var/tmp/trace.2043925204.xt 
grep -n Profile-Main /var/tmp/trace.2043925204.xt 
Dexygen
la source

Réponses:

21

Mieux vaut éviter le chat; écrivez-le de cette façon si l'édition de ligne est importante:

$ < filename grep pattern

La raison en est que pousser toutes les données via cat coûte de la mémoire et des ressources CPU. Un autre avantage de passer le nom de fichier comme argument plutôt que de rediriger stdin est qu'il permet à la commande l'option de mmap () le fichier.

Phil
la source
9

Je ne peux pas croire que personne n'a fait référence « Inutile utilisation de Cat » http://www.smallo.ruhr.de/award.html encore

Il y a un avantage discutable. Si vous avez un long pipeline, il semble un peu plus orthogonal avec cat:

cat file | command1 | command 2 | command3

Il regroupe toutes les commandes ensemble.

Bien sûr, comme d'autres l'ont dit (et je le fais)

< file command1 | command2 | command3

Effectue à peu près la même chose. Cela dit, le chat est assez petit et ne fera pas tomber votre ordinateur si vous l'utilisez lorsque vous n'en avez pas vraiment besoin.

Normalement, l'utilisation de catvs en frappant directement un fichier ne change rien, mais cela fait une différence pour certaines commandes qui se soucient s'il y a plusieurs fichiers comme arguments, tels que grep. Exemple concret:

cat file1 file2 | grep SOMETHING

aura une sortie différente de celle

grep SOMETHING file1 file2

Qui aura les noms de fichiers correspondants dans la sortie. Il y a des moments où je ne veux pas les noms de fichiers, et c'est un avantage d'utiliser cat.

Rich Homolka
la source
1
catest beaucoup plus clair à lire que <. Ou peut-être juste pour nous, fogeys qui pensons qu'Unix et bash pourraient en apprendre beaucoup de VMS et DCL.
RonJohn
8

Il n'y a aucun avantage. Votre curseur étant à la fin n'a pas beaucoup d'importance si vous le structurez comme ceci à la place:< inputfile grep -args foo

Daenyth
la source
6

Vous n'avez tout simplement pas du tout besoin d'utiliser cat dans cette situation. C'est inutile et une perte de temps, car des outils tels que grep prennent les noms de fichiers comme arguments.

[root@un1xf00 root]# time cat passwd | grep root
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

real    0m0.021s
user    0m0.000s
sys     0m0.030s
[root@un1xf00 root]# time grep root passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

real    0m0.002s
user    0m0.000s
sys     0m0.000s
[root@un1xf00 root]#

Mise à jour: Merci, @Andy Lester, d'avoir souligné que ces timings ne prennent pas en compte le cache disque. J'ai appris quelque chose de nouveau! Mais des économies d'une fraction de seconde ne font pas beaucoup de différence de toute façon. Je pense simplement que diriger le chat vers grep n'est pas une façon logique de faire les choses. C'est comme demander à quelqu'un de vous aider avec un problème, lorsque vous êtes parfaitement capable de le résoudre vous-même.

dogbane
la source
1
@Michael: A -10 à vous d'être obtus. Vous auriez pu être plus utile. Dommage que vous ne le verrez pas car vous n'avez pas de compte ici.
pause jusqu'à nouvel ordre.
4
Michael dit que les timings ci-dessus ne prennent pas en compte le cache disque. (et un -0.29 à Dennis pour être plus intéressé à frapper Michael qu'à dé-obtus la réponse)
Andy Lester
1
Je suppose que s'il doit y avoir du bruit plutôt que du signal, les commentaires sont l'endroit pour ça. Merci @Andy car je ne savais pas que Michael faisait référence au cache disque.
Dexygen
3

La facilité d'édition est le seul véritable avantage, et si vous le faites sur la ligne de commande, le temps supplémentaire nécessaire pour exécuter le catet faire le pipe ne fera pas vraiment de différence.

Il n'y a cependant aucune raison de le faire dans un script shell.

Blrfl
la source
2

Il n'y a aucun avantage. Au lieu de vous soucier de modifier les commandes, apprenez à mieux naviguer dans votre ligne de commande shell avec les touches accélératrices et les raccourcis.

Andy Lester
la source
1

Non et cela pourrait même être extrêmement lent dans l'exemple que vous donnez.

Un pipeest créé entre cat et grep, ce qui n'est pas obligatoire lors du passage du nom de fichier directement à grep. Cependant, je ne pense en aucun cas que vous observerez des limitations de débit à cause de cela.

Parmi les autres avantages de la canalisation d'entrée vers grep, citons un traitement supplémentaire préalable, comme l'utilisation d'utilitaires avec des capacités de lecture de fichiers plus avancées. (Voir tee, zcatentre autres).

Matt Joiner
la source