Vantaggi del file cat'ing e delle tubazioni per grep


19

Ci sono ulteriori vantaggi nel creare un file e inviarlo a grep, oltre alla praticità? La comodità è che, quando recupero comandi come quelli seguenti dalla mia cronologia, il cursore si trova alla fine della riga, quindi è facile modificare il comando con testo diverso per grep contro lo stesso file.

Quindi quali altri vantaggi potrebbero esserci alla seguente convenzione:

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

invece di:

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

Risposte:


21

Meglio evitare il gatto; scrivilo in questo modo se la modifica delle righe è importante:

$ < filename grep pattern

Il motivo è che l'invio di tutti i dati attraverso cat costa memoria e risorse della CPU. Un altro vantaggio del passaggio del nome file come argomento anziché reindirizzamento di stdin è che consente al comando l'opzione di mmap () il file.


9

Non posso credere che nessuno ha fatto riferimento "Inutile Uso di Cat" http://www.smallo.ruhr.de/award.html ancora

C'è un vantaggio discutibile. Se hai una lunga pipeline, sembra un po 'più ortogonale con cat:

cat file | command1 | command 2 | command3

Raggruppa tutti i comandi insieme.

Naturalmente come altri hanno già detto (e lo faccio)

< file command1 | command2 | command3

Esegue praticamente la stessa cosa. Detto questo, il gatto è piuttosto piccolo e non abbasserà il computer se lo usi quando non è davvero necessario.

Normalmente l'uso di catvs che colpisce direttamente un file non cambia nulla, ma fa la differenza per alcuni comandi a cui importa se ci sono più file come argomenti, come grep. Caso in questione:

cat file1 file2 | grep SOMETHING

avrà un output diverso da

grep SOMETHING file1 file2

Che avrà i nomi dei file corrispondenti nell'output. Ci sono volte in cui non voglio i nomi dei file, ed è un vantaggio usare cat.


1
catè molto più chiaro da leggere di <. O forse solo per noi fannulloni che pensano che Unix e Bash possano imparare molto da VMS e DCL.
Ron John

8

Non ci sono vantaggi Il tuo cursore alla fine, inoltre, non importa molto se lo strutturi in questo modo invece:< inputfile grep -args foo


6

Semplicemente non è necessario usare cat in questa situazione. Non è necessario e è una perdita di tempo, perché strumenti come grep prendono i nomi dei file come argomenti.

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

Aggiornamento: Grazie, @Andy Lester, per aver sottolineato che questi tempi non tengono conto della cache del disco. Ho imparato qualcosa di nuovo! Ma il risparmio di una frazione di secondo non fa comunque molta differenza. Penso solo che convogliare il gatto in grep non sia un modo logico di fare le cose. È come chiedere a qualcun altro di aiutarti con un problema, quando sei perfettamente in grado di risolverlo da solo.


1
@Michael: A -10 per te per essere ottuso. Avresti potuto essere più utile. Peccato che non lo vedrai dal momento che non hai un account qui.
In pausa fino a nuovo avviso.

4
Michael sta dicendo che i tempi sopra indicati non tengono conto della cache del disco. (e un -0.29 a Dennis per essere più interessato a colpire Michael piuttosto che annullare la risposta)
Andy Lester,

1
Suppongo che ci debba essere rumore piuttosto che segnale che i commenti siano il posto giusto. Grazie @Andy perché non sapevo che Michael si riferisse alla cache del disco.
George Jempty,

3

La facilità di modifica è l'unico vero vantaggio e, se lo stai eseguendo dalla riga di comando, qualsiasi ulteriore tempo necessario per eseguire cate eseguire la pipe non farà davvero la differenza.

Non c'è motivo di farlo in uno script di shell, però.


2

Non vi è alcun vantaggio. Invece di preoccuparti di modificare i comandi, impara a navigare meglio nella riga di comando della shell con i tasti di scelta rapida e le scorciatoie.


1

No e potrebbe anche essere molto più lento nell'esempio che dai.

A pipeviene creato tra cat e grep, il che non è necessario quando si passa il nome del file direttamente a grep. Tuttavia, non credo che in nessun caso osserverai mai limiti di velocità effettiva a causa di ciò.

Altri vantaggi dell'input di piping in grep includono l'elaborazione aggiuntiva prima, come l'uso di utility con capacità di lettura dei file più avanzate. (Vedi tee, zcattra gli altri).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.