Análisis de archivos de registro con sed -e. Necesidad de contar nombres de clases únicos

Análisis de archivos de registro con sed -e. Necesidad de contar nombres de clases únicos

Tengo un archivo, llamémoslo nombre de archivo.log, en él tengo algo como esto

(2014-11-18 14:09:21,766), , xxxxxx.local, EventSystem, DEBUG FtpsFile delay secs is 5 [pool-3-thread-7] 
(2014-11-18 14:09:21,781), , xxxxxx.local, EventSystem, DEBUG FtpsFile disconnected from ftp server [pool-3-thread-7] 
(2014-11-18 14:09:21,798), , xxxxxx.local, EventSystem, DEBUG FtpsFile FTP File  Process@serverStatus on exit  - 113 [pool-3-thread-7] 
(2014-11-18 14:09:21,798), , xxxxxx.local, EventSystem, DEBUG FtpsFile FTP File  Process@serverStatus on exit  - 114 [pool-3-thread-7] 
(2014-11-18 14:09:21,799), , xxxxxx.local, EventSystem, DEBUG JobQueue $_Runnable Finally of consume() :: [pool-3-thread-7] 

Estoy tratando de encontrar las clases que producen los mensajes DEBUG más frecuentes.

En este ejemplo puedes verArchivo FtpsyCola de trabajosson dos de las clases que producen un mensaje.

tengo esto

cat filename.log | sed -n -e 's/^.*\(DEBUG \)/\1/p' | sort | uniq -c | sort -rn | head -10

Esto producirá el nombre de la clase y me mostrará las clases más frecuentes como un top 10.

El problema es que esto no me da el conteo de la clase.Archivo Ftpscomo 4. Cuenta cada archivo de registro FtpsFile como una entidad única diferente.

¿Cómo cambio el comando anterior para que básicamente diga tomar la primera palabra después de DEBUG e ignorar el resto para contar?

Lo ideal sería obtener 4 FtpsFile 1 JobQueue

Respuesta1

  • Con GNU sed:

    sed 's/.*DEBUG \(\w*\).*/\1/' | uniq -c
          4 FtpsFile
          1 JobQueue
    
  • Con grep:

    grep -Po 'DEBUG \K\w+' | uniq -c
          4 FtpsFile
          1 JobQueue
    
  • Con awk:

    awk '$6=="DEBUG"{print $7}' | uniq -c
          4 FtpsFile
          1 JobQueue
    

El último se puede hacer en estado puro awk, pero por motivos de similitud lo transfirí a uniq.

Respuesta2

Solución rápida: agregué el siguiente comando de corte para resaltar ese campo:

[host:~]$ cat logfile | cut -d" " -f7 | sort | uniq -c | sort -rn | head -10
      4 FtpsFile
      1 JobQueue

En mi afán por KISS, esto no aplica a clases con un espacio en el nombre.

Respuesta3

Puede usar awk (en lugar de sed) para evitar mirar los campos anteriores al que le interesa y luego cortar la sección que desea ver:

[hunter@apollo: ~]$ cat filename.log | awk -F, '{ print $6 }' | cut -c 1-15 | uniq -c | sort -rn | head -10
      4  DEBUG FtpsFile
      1  DEBUG JobQueue

(Nota: también estabas clasificando dos veces, lo que parece innecesario)

EDITAR: Si no sabe cuánto durarán las clases, puede agregar un comando awk adicional (en lugar de cortar):

[hunter@apollo: ~]$ cat filename.log | awk -F, '{ print $6 }' | awk '{ print $1, $2 }' | uniq -c | sort -rn | head -10
      4 DEBUG FtpsFile
      1 DEBUG JobQueue

información relacionada