Adicione o retorno de carro à saída de 'tail' enquanto estiver usando 'grep'

3

Estou tentando refatorar o seguinte comando:

tail -f production.log |
    grep -e "Processing " -e "compatible;" -e "Completed in " -e

Esta é a saída do comando:

Processing BasketController#cross_sell_product (for 85.189.237.x at 2011-08-03 12:46:07) [POST] "RequestLog","2011-08-03 12:46:07","12595","www.website.com","/basket/cross_sell_product/113","85.189.237.x","Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)" Completed in 0.07853 (12 reqs/sec) | Rendering: 0.01402 (17%) | DB: 0.01439 (18%) | 200 OK [https://www.website.com/basket/cross_sell_product/113]

Isso é ótimo e exatamente o que eu quero, no entanto, eu gostaria de ver um retorno de carrinder ou dois depois para que eu possa estudar os logs como blocos.

Eu tentei adicionar \n ao final, mas isso não funcionou.

    
por user9563 03.08.2011 / 13:49

2 respostas

3

Eu não tenho certeza do que você quer, mas o awk provavelmente pode fazer isso facilmente. Para adicionar uma nova linha extra após cada linha de correspondência:

tail -f production.log |
awk '/Processing|compatible;|Completed in / {print; print ""}'

Para adicionar uma nova linha entre todos os blocos de linhas correspondentes não consecutivas:

tail -f production.log |
awk '
/Processing|compatible;|Completed in / {
    if (NR == n+1) print "";
    n = NR;
    print;
}'
    
por 05.08.2011 / 01:08
1

grep filtrará as linhas vazias, pois elas não correspondem a nenhum padrão. No caso de separadores de linha vazios aparecerem no arquivo original, você pode deixá-los passar, adicionando -e "^$" .

Se essas linhas vazias não estiverem presentes no arquivo original, você precisará adicioná-las. Este é um exemplo de como fazer isso:

 tail -f production.log | grep -e … | sed 's/\(^Processing \)/\n/'

Editar: se você quiser uma linha vazia após todas as outras linha use sed 's/$/\n/' . E, claro, você pode adicionar quantos \n desejar.

    
por 03.08.2011 / 14:03