como imprimir a contagem de padrões correspondentes / não correspondentes e imprimir vários padrões separados por linha

0

como imprimir a contagem de padrões correspondentes / não correspondentes e imprimir vários padrões separados por linha.

Exemplo de entrada ( test.log ):

This 23 line has eight 8888
This 11 line has three 3333
need 12 to separate eight and three 3333
eight 32 is greater than three 8888
three 13 is less than eight 3333
three 14 is printed more than eight 3333

Saída desejada:

8888:4
3333:2
5555:0
This 11 line has three 3333
need 12 to separate eight and three 3333
three 13 is less than eight 3333
three 14 is printed more than eight 3333
============================================
This 23 line has eight 8888
eight 32 is greater than three 8888
==========================================

o que eu tentei até agora:

  1. para obter o número de linhas: egrep -o '8888|3333|5555' test.log | sort| uniq -c

saída:

4 3333
2 8888

mas não está imprimindo 0 5555 para indicar a ocorrência zero de cinco no arquivo test.log

resultado desejado:

4 3333
2 8888
0 5555
  1. egrep '8888|3333' test.log | sort -V

esse tipo de saída em ordem alfabética e não de acordo com a saída esperada como mostrado abaixo:

This 11 line has three 3333
need 12 to separate eight and three 3333
three 13 is less than eight 3333
three 14 is printed more than eight 3333
============================================
This 23 line has eight 8888
eight 32 is greater than three 8888
==========================================
    
por star 19.05.2016 / 21:54

1 resposta

0

O programa que você está procurando e que pode fazer facilmente o que você quer é chamado awk . : -)

Ele pode fazer ações programadas em padrões de ER correspondentes.

Programa não testado, simplificado, rotativo, exemplo awk que deve funcionar com sua entrada de exemplo e padrões especificados:

BEGIN {
    eights = 0;
    fives = 0;
    threes = 0;
}
/8888/ {
    eightln[eights] = $0;
    eights++;
}
/5555/ {
    fiveln[fives] = $0;
    fives++;
}
/3333/ {
    threeln[threes] = $0;
    threes++;
}
# ... and so on
END {
    printf("%d 8888\n", eights);
    printf("%d 5555\n", fives);
    printf("%d 3333\n", threes);
    for (i = 0; i < eights; i++) {
        print eightln[i];
    }
    print "=========="
    for (i = 0; i < fives; i++) {
        print fiveln[i];
    }
    print "=========="
    for (i = 0; i < threes; i++) {
        print threeln[i];
    }
}
    
por 20.05.2016 / 00:52