Necesito buscar en nuestros registros de correo una dirección de correo electrónico específica. Mantenemos un archivo actual llamado maillog , así como una semana de archivos .bz2 en la misma carpeta. Actualmente, estoy ejecutando los siguientes comandos para buscar el archivo:
grep person@domain.com maillog
bzgrep person@domain.com *.bz2
¿Hay alguna forma de combinar los comandos grep
y bzgrep
en una sola salida? De esa manera, podría canalizar los resultados combinados a un solo correo electrónico o un solo archivo.
()
lugar de{}
?()
pero no{}
, de cualquier manera +1 ya que esto es lo que necesitaba.Por defecto, bzgrep se convierte automáticamente en grep normal si un archivo no está comprimido mediante bzip. Por lo tanto, lo siguiente debería ser suficiente:
oh, por supuesto, aquí también está mi solución paralela obligatoria de GNU :
que podría ser mucho más rápido si está revisando muchos archivos.
fuente
Aquí hay otra forma de hacerlo (suponiendo que esté ejecutando bash, que probablemente lo sea):
Aquí bash está alimentando de manera transparente la salida de los comandos bzgrep y grep en cat como si fueran archivos (y de alguna manera están debajo del capó, los detalles en la url en la parte inferior).
En su caso particular, recomendaría la solución de Phil, pero lo anterior es un buen truco para guardar en su bolso.
Si está interesado, puede leer más aquí: http://www.tldp.org/LDP/abs/html/process-sub.html
fuente
En el momento de escribir esto, la sintaxis de la respuesta aceptada era incorrecta para la mayoría, si no para todos, los shells derivados de Bourne, incluidos
bash
. Sugerí una edición en la parte superior y acepté la respuesta para corregirlo, pero también me incliné a agregar toda esta otra información, y esto habría sido más una reescritura en lugar de una edición.Puede usar comandos compuestos:
..o subcapas (tenga en cuenta los paréntesis en lugar de llaves):
..para agrupar los comandos. La forma de subshell tiene una sintaxis más agradable (más indulgente con la falta de espacios en blanco y le permite omitir el último punto y coma), pero bifurca un nuevo proceso o "finge" al ejecutar los comandos en un entorno limpio. Ambos tienen ventajas dependiendo de lo que quieras hacer, lo que no importa aquí, pero vale la pena buscarlo si quieres más habilidad con el shell.
Nota: También puedes usar la canalización con estos trucos, por lo que puedes hacer algo como esto:
PS si no se preocupan por el orden de los partidos en su salida combinada, se podría utilizar una sola
&
entre los dos comandos, así:{ grep ... & bzgrep ...; }
. Luego, los dos comandos se ejecutan simultáneamente:grep
se inicia y el shell lo pone en segundo plano, luego el shell ejecutará elbzgrep
. (Pero hay una pequeña advertencia con eso, con la explicación que involucra la redirección de archivos y el almacenamiento en búfer de la secuencia de archivos que puede causar que una porción muy pequeña de las líneas en el archivo de salida se divida / destruya: si vería esto dependería de cómogrep
,bzgrep
, y laslibc
stdio.h
funciones están implementadas. En la mayoría de las implementaciones, creo que canalizar el comando antes de redirigir a un archivo evitará el problema, por lo que podría hacer{ foo & bar; } | cat - >file
una solución alternativa).fuente
Puede vincular los comandos con &&, lo que le permitirá ejecutar cada comando.
también puede agregar >> textfile.txt al final de cada comando y hacer que la salida golpee un archivo y luego enviarlo por correo.
fuente
grep ... && bzgrep ...
, si grep no tuvo aciertos, devolvería el error y el comando se detendría.>>
Sin embargo, es una buena idea, a diferencia de>
, agregará salida al final de un archivo existente.