AWK ajuda de saída

0

No momento, estou escrevendo algo para analisar alguns logs do apache, mas o comando system parece estar se colocando acima da impressão. Não fiz muito com awk , então pode ser algo muito simples.

IFS=$'\n' 
for ja in 'cat test.apache.access_log | awk '{print $1}' | sort -n | uniq -c | sort -rn | head -3'
do 
echo $ja|awk '{print "Count\tIP\t\tNSLookup"}{print $1"\t",$2,"\t\t",system("nslookup " $2"|grep name")}'
done

O que eu recebo:

Count   IP              NSLookup
RR.ZZ.YY.XX.in-addr.arpa      name = ja.server.net.
241      XX.YY.ZZ.RR           0 

O que eu gostaria de ver é:

Count   IP              NSLookup
241      XX.YY.ZZ.RR          RR.ZZ.YY.XX.in-addr.arpa      name = ja.server.net. 
    
por bomahony 29.07.2016 / 14:39

1 resposta

2

Seu script precisa ser reordenado um pouco e awk não precisa de nada

echo -e 'Count\tIP\tNSLookup'
while read count line ; do
    echo -ne "$count\t$line\t"
    nslookup $line | grep name
done < <(cut -d' ' -f1 test.apache.access_log | sort | uniq -c | sort -rn | head -3)

E claro que isso pode ser feito apenas pelo awk

awk '
    BEGIN{
        OFS="\t"
        print "Count", "IP", "NSLookup"
    }
    {
        A[$1]++
    }
    END{
        for(a in A){
            i = 3
            while(i > 0 && A[a] > A[B[i]]){
                B[i+1] = B[i]
                i--
            }
            B[i+1] = a
        }
        for(b=1; b<4; b++){
            "nslookup "B[b]" | grep name" | getline ns
            print A[B[b]], B[b], ns
        }
    }
    ' test.apache.access_log
    
por 29.07.2016 / 15:12

Tags