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:
- 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 5555
para indicar que no aparece cinco en el archivo test.log
salida deseada:
4 3333
2 8888
0 5555
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 awk
que 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];
}
}