différence entre grep Vs chat et grep
je voudrais savoir la différence entre le dessous de 2 commandes, je comprends que 2) devrait être utilisée, mais je veux savoir la séquence exacte qui se passe en 1) et 2)
supposons que le nom de fichier a 200 caractères
1) cat nom de fichier | grep regex
2) grep regex nom de fichier
OriginalL'auteur unixadmin007 | 2012-11-22
Vous devez vous connecter pour publier un commentaire.
Fonctionnellement (en termes de production), ces deux sont les mêmes. Le premier crée en fait un processus distinct
cat
qui il suffit d'envoyer le contenu du fichier sur la sortie standard, qui s'affiche sur l'entrée standard de lagrep
, parce que la coquille a relié les deux avec un tuyau.Dans ce sens
grep regex <filename
est également équivalent mais avec un processus moins.Où vous allez commencer à voir la différence est dans les variantes quand l'information supplémentaire (les noms de fichier) est utilisé par
grep
, tels que:La différence entre celle-ci et:
est que l'ancien sait sur les fichiers individuels alors que les seconds se voit comme un fichier (sans nom).
Tandis que le premier peut vous donner:
ce dernier sera plus comme:
Un autre fichier exécutable qui agit différemment s'il connaît les noms de fichier est
wc
, le compteur de mots de programmes:OriginalL'auteur paxdiablo
Première:
Normalement chat ouvre un fichier et affiche son contenu ligne par ligne sur la sortie standard stdout. Mais ici, il renvoie son contenu à la pipe'|'. Après que grep lit de tuyau(pipe comme stdin) alors si correspond à l'expression rationnelle imprime ligne sur la sortie standard stdout. Mais ici, il y a un détail grep est ouvert à de nouveaux processus du shell afin de tuyau transmet son entrée comme la sortie de nouveaux processus de shell.
Seconde:
Ici grep lit directement à partir d'un fichier(au-dessus c'était la lecture de la conduite) et correspond à l'expression rationnelle si elle s'accompagne d'estampes ligne sur la sortie standard stdout.
cat
toujours écrit sur sa sortie standard, mais dans le contexte de la pipe, la sortie standard est l'écriture, à la fin du tube. De même, lorsquegrep
est appelée sans arguments de noms de fichiers, ou lorsqu'il traite un nom de fichier en argument de-
, il lit son entrée standard, qui, dans ce cas, est lire la fin de la pipe. Notez quepipe
ou|
n'est pas un commandement; il n'est pas assez clair, si vous reconnaissez qu'avec "so pipe transmet son entrée comme la sortie de nouveaux processus de shell'.OriginalL'auteur denizeren
Si vous souhaitez vérifier les temps d'exécution diffrence, d'abord créer un fichier avec 100000 lignes:
Mesure:
Comme nous pouvons le voir, la différence n'est pas trop grand...
time
de commande temps de lacat
ou de l'ensemble du pipeline?Quelle quantité de temps que vous avez observée était due à l'omis de sortie de l'écrit à l'écran? J'ai essayé avec la sortie de
grep
redirigé vers/dev/null
et eu temps de dans la de 10 à 50 ms gamme, pas 1 seconde plage. Maintenant, ma machine n'est pas en reste, mais 20 fois plus rapide que le vôtre semble peu probable (même en admettant que le fichier est probablement la plupart à la mémoire, pas sur le disque). Il est très difficile de faire une bonne analyse comparative. Ce que j'ai peur que l'on mesure est le temps consacré à l'écriture de 100 000 lignes de votre terminal, plutôt que les performances brutes degrep
vscat | grep
.Vous avez peut-être raison, je n'ai pas pris ça en compte.
Pour n'importe qui qui peut être curieux de connaître les résultats avec les commentaires ci-dessus, j'ai juste rediffusé en utilisant le même fichier comme ci-dessus, mais avec ces délais des commandes:
time grep line test_f > /dev/null
ettime (cat test_f | grep line > /dev/null)
. Les temps ne sont plus en ligne avec @JonathanLeffler 's résultats, mais les deux commandes sont encore presque exactement à la même vitesse.OriginalL'auteur dstronczak
Fonctionnellement, ils sont équivalents, cependant, l'environnement de ligne de commande de la fourche de deux processus de
cat filename | grep regex
et de les relier à un tuyau.OriginalL'auteur iabdalkader
En fait, si les sorties sont les mêmes;
Cette commande vérifie le contenu du fichier "nom de fichier", puis extrait les regex; tandis que
Cette commande directement recherches pour le contenu nommé regex dans le fichier "filename"
OriginalL'auteur Nji