Extraindo consultas do arquivo de log que não incluem linhas banidas

4

Eu tenho um arquivo de log parecido com o seguinte:

query1 startQuery
query1 do something
query1 do something else
query2 startQuery
query1 do something banned
query2 do something
query3 startQuery
query2 endQuery 1000
query3 something else to do
query1 endQuery 2003
query3 do something
query4 startQuery
query4 endQuery 100
query3 endQuery 1434

Estou encontrando as consultas mais longas:

> grep "endQuery" logfile | awk '{print $3 " " $1}' | sort -nr | head -n 3
2003 query1
1434 query3
1000 query2

No entanto, existem algumas operações conhecidas por serem longas, e eu quero encontrar as consultas mais longas que não incluem essas operações. Por exemplo, eu quero encontrar as consultas mais longas que não incluam, em qualquer uma de suas linhas de registro, a palavra "banido".

Neste exemplo, ele produziria:

1434 query3
1000 query2
100 query4

Na realidade, esses arquivos de log são grandes e contêm muitas consultas.

    
por ICR 03.09.2011 / 02:04

2 respostas

4

Primeiro, observe que você não precisa da chamada para grep , a propósito: ela pode ser perfeitamente integrada à chamada awk .

<logfile awk '/endQuery/ {print $3 " " $1}'

Você pode filtrar as consultas banidas no estágio do awk. Armazene consultas em andamento em uma matriz, remova-as se elas forem banidas e apenas imprima as não proibidas.

<logfile awk '
    $2 == "startQuery" {q[$1]=1}        # store the names of active queries
    q[$1] && /banned/ {delete q[$1]}    # delete banned queries
    $2 == "endQuery" {
        if (q[$1]) print $3, $1;        # only report non-banned queries
        delete q[$1];
    }
' | sort -nr | head -n 3
    
por 03.09.2011 / 13:24
0

Eu consegui formular o seguinte:

diff <(grep "endQuery" logfile | awk '{print $1}') \
     <(grep "banned"   logfile | awk '{print $1}') | \
  grep "<" | awk '{print $2}' | xargs -I{0} grep "{0} endQuery" logfile | \
    awk '{print $3 " " $1}' | sort -nr | head -n3
1434 query3
1000 query2
100 query4

No entanto, é necessário passar pelo arquivo de log 3 vezes, o que pode ser caro para arquivos de log grandes.

    
por 03.09.2011 / 02:36