Pude hacer una tail -f
salida con colores usando el awk
comando. Pero no estoy seguro de cómo generar el resto del registro, ya que parece estar filtrando solo esas 2 líneas. También quiero ver las otras líneas a medida que se escribe el registro.
¿Qué necesito poner en el awk
comando para mostrar el resto del resultado?
Imagen de mi problema. El texto rojo de arriba no se usa awk
y muestra el archivo completo tail -f log
. Y debajo está el mismo comando con el awk
filtrado de color.
Respuesta1
En lugar de imprimir líneas a juego con decoraciones, decora líneas a juego e imprime todo:
awk '/User@Host:/ { $0 = "\033[32m" $0 "\033[39m" }; /Query_time:/ { $0 = "\033[29m" $0 "\033[39m" }; 1'
Este awk
programa consta de tres patrones y acciones asociadas:
- las líneas coincidentes
User@Host:
se procesan con$0 = "\033[32m" $0 "\033[39m"
, que rodea la línea actual con los códigos de escape dados; - las líneas coincidentes
Query_time:
se procesan con$0 = "\033[29m" $0 "\033[39m"
; - Las líneas para las cuales el patrón
1
es distinto de cero (por lo que todas las líneas) se procesan con la acción predeterminada, que es imprimir la línea actual.
Son acumulativos: todas las acciones cuyos patrones coinciden con la línea actual se ejecutan, en el orden en que están definidas. Se modifica una línea coincidente User@Host:
(primera acción) y se imprime (tercera acción). Se modifica una coincidencia de línea Query_time:
(segunda acción) y se imprime (tercera acción). Se imprime una línea que no coincide con ninguno de los dos (tercera acción).
Esa es la técnica más sencilla para imprimir todas las líneas, sin tener que realizar un seguimiento de si una línea se ha procesado todavía (para evitar imprimir una línea dos veces). En lugar de imprimir algo en cada conjunto de declaraciones de acción, modificamos la línea actual según corresponda y solo la imprimimos una vez (pero siempre la imprimimos).