¿Existe un comando que combine `tee` y `grep` de manera que en una canalización la parte tee pueda dirigir coincidencias a un archivo?

¿Existe un comando que combine `tee` y `grep` de manera que en una canalización la parte tee pueda dirigir coincidencias a un archivo?

Estoy buscando extraer varias piezas de un archivo, o al menos observar las piezas en un archivo de registro si ocurren, pero no quiero configurar varias tail | grepsesiones. En lugar de eso, me gustaría simplemente seguir la salida de cada grep.

Supongo que podría hacer esto con awk, pero quizás ya haya algo más parecido a esta idea.

Por ejemplo, el comando podría verse así:

tail -f /var/log/syslog | teegrep cron1 -f CRON | teegrep cloud-init2 -f CLOUD-INIT

La salida serían los archivos CRON y CLOUD-INIT, mientras que todo iría a la salida estándar al final. Sólo las coincidencias de las líneas 'cron1' y 'cloud-init2' terminarían en sus respectivos archivos.

Quizás ya sea parte de un comando y simplemente no lo sabía. O posiblemente simplemente algún truco de bash/zsh que haría lo mismo. De cualquier manera: ¿Existe un comando que combine teey grepque en una canalización la parte en T pueda dirigir coincidencias a un archivo?

Respuesta1

Suponiendo un shell con sustituciones de procesos >(...),:

tail -f /var/log/syslog | 
tee >(grep cron1 >CRON) | 
tee >(grep cloud-init2 >CLOUD-INIT)

Esto provocaría tailque se produjeran datos para los primeros teeen proceso. Duplicarían teelos datos y enviarían una copia a la siguiente teey la otra a un proceso de sustitución. Ese proceso de sustitución se ejecutaría grepcon los datos que llegan teey el resultado iría al archivo CRON.

La última etapa del oleoducto funcionaría de manera similar.


En un shell donde las sustituciones de procesos no están disponibles, por ejemplo /bin/sh, awko sedpodrían usarse.

Con awk:

tail -f /var/log/syslog | 
awk '{ print }
     /cron1/       { print >"CRON" }
     /cloud-print/ { print >"CLOUD-INIT" }'

Con sed(tenga en cuenta que debemos asegurarnos de que los archivos de salida no existan, ya que el wcomando sedsiempre agrega datos a un archivo):

rm -f CLOUD CLOUD-INIT

tail -f /var/log/syslog | 
sed -e '/cloud/w CLOUD' \
    -e '/cloud-print/w CLOUD-INIT'

información relacionada