Ventajas de cat'ing file y tubería a grep


19

¿Hay alguna ventaja adicional de atrapar un archivo y convertirlo en grep, además de la comodidad? La conveniencia es que, cuando recupero comandos como los siguientes de mi historial, el cursor está al final de la línea, por lo que es fácil modificar el comando con un texto diferente para agruparlo en el mismo archivo.

Entonces, ¿qué otras ventajas podría tener la siguiente convención:

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

en lugar de:

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

Respuestas:


21

Es mejor evitar el gato; escríbalo de esta manera si la edición de líneas es importante:

$ < filename grep pattern

La razón es que empujar todos los datos a través de cat cuesta recursos de memoria y CPU. Otro beneficio de pasar el nombre de archivo como argumento en lugar de redireccionar stdin es que le permite al comando la opción de mmap () el archivo.


9

No puedo creer que nadie haya mencionado "Uso inútil del gato" http://www.smallo.ruhr.de/award.html todavía

Hay una ventaja cuestionable. Si tiene una tubería larga, se ve un poco más ortogonal con cat:

cat file | command1 | command 2 | command3

Agrupa todos los comandos juntos.

Por supuesto, como otros han dicho (y yo hago)

< file command1 | command2 | command3

Realiza más o menos lo mismo. Dicho esto, cat es bastante pequeño y no apagará tu computadora si la usas cuando realmente no lo necesitas.

Normalmente, usar catvs golpear directamente un archivo no cambia nada, pero sí hace una diferencia para ciertos comandos que se preocupan si hay múltiples archivos como argumentos, como grep. Caso en punto:

cat file1 file2 | grep SOMETHING

tendrá una salida diferente a

grep SOMETHING file1 file2

Que tendrá los nombres de archivo coincidentes en la salida. Hay veces que no quiero los nombres de archivo, y es una ventaja usarlo cat.


1
cates mucho más claro de leer que <. O tal vez solo para nosotros, los fogeys que pensamos que Unix y bash podrían aprender muchísimo de VMS y DCL.
RonJohn

8

No hay ventaja Su cursor al final tampoco importa mucho si lo estructura así:< inputfile grep -args foo


6

Simplemente no necesita usar cat en esta situación en absoluto. Es innecesario y una pérdida de tiempo, porque herramientas como grep toman nombres de archivos como argumentos.

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

Actualización: Gracias, @Andy Lester, por señalar que estos tiempos no tienen en cuenta la memoria caché del disco. ¡Aprendí algo nuevo! Pero los ahorros de una fracción de segundo no hacen mucha diferencia de todos modos. Solo creo que poner a cat en grep no es una forma lógica de hacer las cosas. Es como pedirle a alguien que te ayude con un problema, cuando eres perfectamente capaz de resolverlo tú mismo.


1
@Michael: A -10 para ti por ser obtuso. Podrías haber sido más útil. Lástima que no veas esto ya que no tienes una cuenta aquí.
Pausado hasta nuevo aviso.

44
Michael dice que los tiempos anteriores no tienen en cuenta la memoria caché del disco. (y un -0.29 a Dennis por estar más interesado en golpear a Michael que quitarle la respuesta)
Andy Lester el

1
Supongo que si debe haber ruido en lugar de indicar que los comentarios son el lugar indicado. Gracias @Andy ya que no sabía que Michael se refería al caché de disco.
Dexygen

3

La facilidad de edición es la única ventaja real, y si lo está haciendo en la línea de comando, cualquier tiempo adicional que se necesite para ejecutar caty hacer la tubería realmente no hará la diferencia.

Sin embargo, no hay razón para hacerlo en un script de shell.


2

No hay ningún beneficio en absoluto. En lugar de preocuparse por modificar los comandos, aprenda a navegar mejor la línea de comandos de su shell con teclas aceleradoras y accesos directos.


1

No, e incluso podría ser minuciosamente más lento en el ejemplo que da.

A pipese crea entre cat y grep, lo cual no es necesario al pasar el nombre de archivo directamente a grep. Sin embargo, no creo que bajo ninguna circunstancia observe alguna vez limitaciones de rendimiento debido a esto.

Otras ventajas de la entrada de tubería a grep incluyen procesamiento adicional previo, como el uso de utilidades con capacidades de lectura de archivos más avanzadas. (Ver tee, zcatentre otros).

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.