Consegui fazer uma tail -f
saída com cores usando o awk
comando. Mas não tenho certeza de como gerar o restante do log, pois parece estar filtrando apenas essas duas linhas. Também quero ver as outras linhas conforme o log é gravado.
O que preciso colocar no awk
comando para mostrar o restante da saída?
Imagem do meu problema. O texto em vermelho acima está sem uso awk
e exibe o arquivo tail -f log
. E abaixo disso está o mesmo comando com a awk
filtragem de cores.
Responder1
Em vez de imprimir linhas correspondentes com decorações, decore as linhas correspondentes e imprima tudo:
awk '/User@Host:/ { $0 = "\033[32m" $0 "\033[39m" }; /Query_time:/ { $0 = "\033[29m" $0 "\033[39m" }; 1'
Este awk
programa consiste em três padrões e ações associadas:
- as linhas correspondentes
User@Host:
são processadas com$0 = "\033[32m" $0 "\033[39m"
, que circunda a linha atual com os códigos de escape fornecidos; - as linhas correspondentes
Query_time:
são processadas com$0 = "\033[29m" $0 "\033[39m"
; - as linhas para as quais o padrão
1
é diferente de zero (portanto, todas as linhas) são processadas com a ação padrão, que é imprimir a linha atual.
São cumulativas: todas as ações cujos padrões correspondem à linha atual são executadas, na ordem em que foram definidas. Uma correspondência de linha User@Host:
é modificada (primeira ação) e impressa (terceira ação). Uma correspondência de linha Query_time:
é modificada (segunda ação) e impressa (terceira ação). Uma linha que não corresponde a nenhuma delas é impressa (terceira ação).
Essa é a técnica mais simples para imprimir todas as linhas, sem precisar saber se uma linha já foi processada (para evitar imprimir uma linha duas vezes). Em vez de imprimir algo em cada conjunto de instruções de ação, modificamos a linha atual conforme apropriado e a imprimimos apenas uma vez (mas sempre a imprimimos).