cómo imprimir el recuento de patrones coincidentes/no coincidentes e imprimir múltiples patrones separados por línea

cómo imprimir el recuento de patrones coincidentes/no coincidentes e imprimir múltiples patrones separados por línea

cómo imprimir el recuento de patrones coincidentes/no coincidentes e imprimir múltiples patrones separados por línea.

Ejemplo 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

Salida deseada :

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
==========================================

lo que he probado hasta ahora:

  1. para obtener el número de líneas:egrep -o '8888|3333|5555' test.log | sort| uniq -c

producción:

4 3333
2 8888

pero no se imprime 0 5555para indicar que no aparece cinco en el archivo test.log

salida deseada:

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

Este tipo de salida se clasifica en orden alfabético y no según la salida que espero, como se muestra a continuación:

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
==========================================

Respuesta1

El programa que estás buscando y que puede hacer fácilmente lo que quieres se llama awk. :-)

Puede realizar acciones programadas en patrones RE coincidentes.

Programa de ejemplo no probado, simplificado y de memoria awkque debería funcionar con su entrada de ejemplo y patrones 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];
    }
}

información relacionada