Vorteile von cat'ing file und piping to grep

19

Gibt es neben der Bequemlichkeit weitere Vorteile, eine Datei zu erstellen und an grep weiterzuleiten? Der Vorteil ist, dass sich der Cursor beim Abrufen von Befehlen wie den folgenden aus meinem Verlauf am Ende der Zeile befindet, sodass es einfach ist, den Befehl mit einem anderen Text zu ändern, um gegen dieselbe Datei zu springen.

Welche weiteren Vorteile könnte die folgende Konvention haben:

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

Anstatt von:

grep -in profile /var/tmp/trace.2043925204.xt 
grep -n Profile-Main /var/tmp/trace.2043925204.xt 
George Jempty
quelle

Antworten:

21

Katze besser meiden; schreibe es so, wenn es auf die Zeilenbearbeitung ankommt:

$ < filename grep pattern

Der Grund dafür ist, dass das Pushen aller Daten durch cat Speicher- und CPU-Ressourcen kostet. Ein weiterer Vorteil der Übergabe des Dateinamens als Argument anstelle der Umleitung von stdin besteht darin, dass der Befehl die Option hat, die Datei mit mmap () zu versehen.

Phil
quelle
9

Ich kann nicht glauben , niemand hat „Useless Verwendung von Cat“ verweist http://www.smallo.ruhr.de/award.html noch

Es gibt einen fragwürdigen Vorteil. Wenn Sie eine lange Pipeline haben, sieht diese bei cat etwas orthogonaler aus:

cat file | command1 | command 2 | command3

Es fasst alle Befehle zusammen.

Natürlich, wie andere gesagt haben (und ich)

< file command1 | command2 | command3

Führt so ziemlich das Gleiche aus. Das heißt, Katze ist ziemlich klein und bringt Ihren Computer nicht zum Erliegen, wenn Sie ihn benutzen, wenn Sie es nicht wirklich brauchen.

Normalerweise catändert die Verwendung von vs, wenn eine Datei direkt getroffen wird, nichts, aber für bestimmte Befehle, die darauf abzielen, ob mehrere Dateien als Argumente vorhanden sind, spielt dies eine Rolle, wie z grep. Ein typisches Beispiel:

cat file1 file2 | grep SOMETHING

wird eine andere Ausgabe haben als

grep SOMETHING file1 file2

Welches wird die passenden Dateinamen in der Ausgabe haben. Manchmal möchte ich die Dateinamen nicht, und es ist von Vorteil, sie zu verwenden cat.

Reiche Homolka
quelle
1
catist viel klarer zu lesen als <. Oder vielleicht nur für uns Fogeys, die denken, dass Unix und Bash eine Menge von VMS und DCL lernen könnten.
RonJohn
8

Es gibt keinen Vorteil. Ihr Cursor am Ende ist auch nicht so wichtig, wenn Sie ihn stattdessen wie folgt strukturieren:< inputfile grep -args foo

Daenyth
quelle
6

Sie brauchen in dieser Situation einfach keine Katze zu benutzen. Dies ist unnötig und Zeitverschwendung, da Tools wie grep Dateinamen als Argumente verwenden.

[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]#

Update: Vielen Dank, @Andy Lester, dass Sie darauf hingewiesen haben, dass bei diesen Timings der Festplatten-Cache nicht berücksichtigt wird. Ich habe etwas Neues gelernt! Aber Einsparungen in Sekundenbruchteilen machen sowieso keinen großen Unterschied. Ich denke nur, dass es nicht logisch ist, cat in grep zu bringen. Es ist so, als würde man jemanden bitten, Ihnen bei einem Problem zu helfen, wenn Sie in der Lage sind, es selbst zu lösen.

Dogbane
quelle
1
@Michael: Eine -10 für dich, weil du stumpf bist. Sie hätten hilfreicher sein können. Schade, dass du das nicht siehst, da du hier keinen Account hast.
Bis auf weiteres angehalten.
4
Michael sagt, dass die obigen Timings den Festplatten-Cache nicht berücksichtigen. (und ein -0,29 an Dennis für sein größeres Interesse, Michael niederzuschlagen, als die Antwort zu entstellen)
Andy Lester
1
Ich nehme an, wenn es eher ein Rauschen als ein Signal geben muss, sind die Kommentare der richtige Ort dafür. Danke @Andy, da ich nicht wusste, dass Michael sich auf den Festplatten-Cache bezog.
George Jempty
3

Die einfache Bearbeitung ist der einzige wirkliche Vorteil, und wenn Sie dies über die Befehlszeile cattun, macht es keinen großen Unterschied, wie lange es dauert, bis die Pipe ausgeführt und ausgeführt wird.

Es gibt jedoch keinen Grund, dies in einem Shell-Skript zu tun.

Blrfl
quelle
2

Es gibt überhaupt keinen Nutzen. Anstatt sich Gedanken über das Ändern der Befehle zu machen, sollten Sie lernen, wie Sie Ihre Shell-Befehlszeile mit Zugriffstasten und Verknüpfungen besser navigieren können.

Andy Lester
quelle
1

Nein, und in dem von Ihnen gegebenen Beispiel könnte es sogar etwas langsamer sein.

A pipewird zwischen cat und grep erstellt, was nicht erforderlich ist, wenn der Dateiname direkt an grep übergeben wird. Ich denke jedoch, dass Sie aus diesem Grund unter keinen Umständen jemals Durchsatzbeschränkungen feststellen werden.

Weitere Vorteile der Weiterleitung von Eingaben an grep sind zusätzliche Verarbeitungsvorgänge, z. B. die Verwendung von Dienstprogrammen mit erweiterten Funktionen zum Lesen von Dateien. (Siehe tee, zcatunter anderem).

Matt Joiner
quelle