Como excluir linhas que não incluem uma string da saída de um script awk?

3

Completamente novo no script em geral, e estamos trabalhando em um script para passar por nossos logs que contêm entradas para uma variedade de coisas diferentes. O que me interessa, são as entradas que registram a atividade do usuário (logins, cliques, etc em nosso site).

Eu juntei o seguinte script awk (com muita ajuda) que quase funciona perfeitamente, exceto que imprime a saída para linhas que não contêm um nome de usuário. Eu gostaria de excluí-los e não consegui descobrir como fazer isso (suponho que seja algo simples).

Aqui está o código:

awk '
{       split($3, d, "@")
        match($0, /"username":"[^"]*"/)
        user = substr($0, RSTART + 12, RLENGTH - 13)
        c[d[1] OFS user]++
}
END {   for(i in c)
                printf("%4d %s\n", c[i], i)
}' mycompany.log | sort -k3,3 -k2,2

Não tenho certeza de como excluir todas as linhas que não contêm nome de usuário da saída.

Aqui está um exemplo de uma linha que contém um nome de usuário:

qtp111659197-5776 - 05-26@09:37:34:240 INFO  (TimingInfoProxy.java:41)     - com.mycompany.api.ApiHandler-0>getUniqueDataBySource(data,{"has_values":false,"last_event_triggered":"","user_info":{"username":"[email protected]","orgid":"69d467a7-9786-47e1-9c12-bb40f9bfc65d","ip":"127.0.0.1"},"date_range":{"min_date":"","start_date":"","end_date":"","trending_start_date":"","trending_end_date":""},"terms":{"and_filtering":[]}},) 

E aqui está um pequeno exemplo de uma linha que não:

main - 05-22@10:05:21:387 INFO  (ContextLoader.java:313)     - Root WebApplicationContext: initialization completed in 9519 ms
    
por zoo_live_crew 28.05.2015 / 18:25

2 respostas

1

Como você já está trabalhando com outros comandos do shell, eu usaria o grep.

awk '
{
...
}' mycompany.log | grep -f '"username:"' | sort -k3,3 -k2,2

(Observe que estou usando -f porque a tag de nome de usuário nunca varia.)

Edit: esse é o caminho mais óbvio. Uma maneira discutivelmente "melhor" seria usar o próprio awk, por exemplo.

awk '
/\"username\":/ {
...
}' mycompany.log | sort -k3,3 -k2,2
    
por 28.05.2015 / 18:56
0

Seu código não está verificando o resultado de match . O seguinte corrige isso.

RSTART is set by invoking the match function. Its value is the position of the string where the matched substring starts, or zero if no match was found.

if(RSTART){
   user = substr($0, RSTART + 12, RLENGTH - 13)
   c[d[1] OFS user]++
}
    
por 29.06.2015 / 12:47

Tags