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 | grep
sesiones. 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 tee
y grep
que 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 tail
que se produjeran datos para los primeros tee
en proceso. Duplicarían tee
los datos y enviarían una copia a la siguiente tee
y la otra a un proceso de sustitución. Ese proceso de sustitución se ejecutaría grep
con los datos que llegan tee
y 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
, awk
o sed
podrí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 w
comando sed
siempre 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'