2011-09-08 8 views
10

que tienen un archivo de registro con entradas como:tipo de archivo de registro por fecha y hora en la línea de comandos de Linux

...  
freeswitch.log:2011-09-08 12:21:07.282236 [ERR] ftdm_queue.c:136 Failed to enqueue obj 0x7f2cda3525c0 in queue 0x7f2ce8005990, no more room! windex == rindex == 58! 
freeswitch.log:2011-08-08 13:21:07.514261 [ERR] ftdm_queue.c:136 Failed to enqueue obj 0x7f2cda354460 in queue 0x7f2ce8005990, no more room! windex == rindex == 58! 
freeswitch.log:2011-06-04 16:21:08.998227 [ERR] ftdm_queue.c:136 Failed to enqueue obj 0x7f2cda356300 in queue 0x7f2ce8005990, no more room! windex == rindex == 58! 
freeswitch.log:2011-09-08 12:21:10.374238 [ERR] ftdm_queue.c:136 Failed to enqueue obj 0x7f2cda3581a0 in queue 0x7f2ce8005990, no more room! windex == rindex == 58! 
... 

¿Cómo puedo ordenar el archivo con herramientas de línea de comandos de Linux por la marca de tiempo en cada fila decending?

+0

¿El espacio es un delimitador común? – ajreal

Respuesta

9

opción -k Uso sort 's:

sort -k1 -r freeswitch.log 

que ordenar el archivo, a la inversa, por la primera clave (es decir freeswitch.log: 2011-09-08 12: 21: 07,282236). Si el nombre del archivo es siempre el mismo (freeswitch.log), debe ordenar por la fecha.

+1

Sin especificar un campo de finalización o un indicador '-s', ese' -k1' no tiene sentido. Vea la explicación en [mi respuesta] (http://stackoverflow.com/a/29508361/34799). –

0

El archivo de registro parece ascendente, puede

tac yourlogfile 

que mostraría a la inversa de su archivo de registro.

+0

Las entradas no están completamente ordenadas por la marca de tiempo aún – markus

0

Supongo que el archivo de registro agrega nuevos datos al final. Si es así, puede leer el archivo al revés. Pruebe con tail -r o cat comando.

+0

no, no están agregando datos, ya grep las líneas que quiero analizar desde el archivo de registro original en un nuevo archivo. – markus

1

puede invertir el género con

sort -r 
+0

, pero cómo decir para ordenar por la marca de tiempo en la fila. Tenga en cuenta que todavía no están ordenados (lo cambio en mi pregunta) – markus

+0

Si entiendo su comentario correctamente, esta respuesta es: grep ftdm_queue.c freeswitch.registro | ordenar -r # esto es una suposición ya que ha proporcionado su línea de comando completa. –

1

técnica de crudo pero efectivo: Prefijo cada línea con una representación numérica de la fecha, más o menos numéricamente, a continuación, quitar la información adicional.

Oneliner:

while IFS=' ' read -r name_date trailing ; do date=$(cut -d: -f2 <<<"$name_date") ; printf '%s:%s\n' $(date -d "$date" +%s) "$name_date $trailing" ; done < freeswitch.log | sort -k1 -t: | cut -d: -f2- 

Shell script:

#!/usr/bin/env bash 

logfile="$1" 

if [ -f "$logfile" ] ; then 
    while IFS=' ' read -r name_date trailing ; do 
      date=$(cut -d: -f2 <<<"$name_date") 
     printf '%s:%s\n' $(date -d "$date" +%s) "$name_date $trailing" 
    done < "$logfile" | sort -k1 -t: | cut -d: -f2- 
fi 

Nota: Requiere fecha de GNU.

Si la salida en este punto es la inversa de lo que desea es fácil de tubería a través de tac o para modificar la secuencia de comandos para pasar también a -rsort.

EDITAR: Me perdí la parte donde el nombre del archivo estaba literalmente en cada línea. La versión actualizada ahora realmente funcionará.

1

Puedes probar a utilizar una especie

sort -k1,2 file 
+0

Incluso con un campo final especificado, la comparación de último recurso hace que '-k1,2' no signifique mucho. Vea la explicación de '--stable' en [mi respuesta] (http://stackoverflow.com/a/29508361/34799). –

10

Uso sort 's --stable, --reverse y --key opciones: (. Para fines no didácticas, esto se puede acortar a -srk1,2)

sort --stable --reverse --key=1,2 freeswitch.log 

El comando sort (como era de esperar) genera cada línea o f los archivos nombrados (o STDIN) en orden ordenado. Lo que cada una de estas opciones tiene:

  • La opción --reverse dice sort para ordenar las líneas con valores mayores (más tarde fechas) superior, en lugar de inferior.Se supone, en base a otras respuestas, que esto es lo que quiere decir con "descender" (aunque este tipo de clasificación normalmente se consideraría "ascendente"). Si desea ordenar las líneas en orden cronológico, omitirá esta opción.
  • La opción --key=1,2 dice sort para usar solo los primeros dos "campos" separados por espacios en blanco (el "freeswitch.log:" - fecha prefijada, y la hora) como la clave para la clasificación. Es importante que especifique el campo último para usar, incluso si solo está ordenando por un campo (por ejemplo, si cada línea guardara la fecha y la hora juntas en un campo estándar ISO-8601 como freeswitch.log 2011-09-08T12:21:07.282236, usaría -k 2,2) , ya que, de forma predeterminada, los campos utilizados por una clave se extienden a hasta el final de la línea.
  • La opción --stable indica sort para no realizar "pedidos de último recurso". Sin esta opción, una línea con dos claves iguales (como se especifica con la opción --keys) se ordenará de acuerdo con toda la línea, lo que significa que el nombre de archivo y el contenido cambiarán el orden de las líneas.

Es importante especificar las dos extensiones de la --key, así como la opción --stable. Sin ellos, varias líneas de salida que ocurrieron al mismo tiempo (en otras palabras, un mensaje de varias líneas) se ordenarían de acuerdo con el contenido del mensaje (sin el segundo campo en --key) y/o el nombre del archivo (sin --stable , si el nombre de archivo es un campo separado, como se describe a continuación).

En otras palabras, un mensaje de registro de esta manera:

freeswitch.log:2011-09-08 12:21:10.374238 Warning: Syntax error on line 20: 
freeswitch.log:2011-09-08 12:21:10.374238 
freeswitch.log:2011-09-08 12:21:10.374238 My[brackets(call) 
freeswitch.log:2011-09-08 12:21:10.374238    ^
freeswitch.log:2011-09-08 12:21:10.374238 Suggestion: 
freeswitch.log:2011-09-08 12:21:10.374238 did you forget to 
freeswitch.log:2011-09-08 12:21:10.374238 close your brackets? 

obtendría "ordenados" en:

freeswitch.log:2011-09-08 12:21:10.374238 
freeswitch.log:2011-09-08 12:21:10.374238    ^
freeswitch.log:2011-09-08 12:21:10.374238 close your brackets? 
freeswitch.log:2011-09-08 12:21:10.374238 did you forget to 
freeswitch.log:2011-09-08 12:21:10.374238 My[brackets(call) 
freeswitch.log:2011-09-08 12:21:10.374238 Suggestion: 
freeswitch.log:2011-09-08 12:21:10.374238 Warning: Syntax error on line 20: 

Ésta es "ordenados" (porque "c" viene antes de " d ", y" S "viene antes de" W "), pero no es en orden. Si especifica --stable (y mantiene su --key acotado) omitirá la clasificación adicional y conservará la orden, que es lo que desea.


Además, la clasificación por este campo de nombre de archivo y fecha combinada sólo funcionará si cada línea en su salida comienza con el mismo nombre de archivo. Dada la sintaxis que publicó, si su entrada tiene múltiples nombres de archivo diferentes que desea ignorar en la ordenación, debe usar un programa como sed para convertir el nombre de archivo a su propio campo separado por espacios, luego canalizar las líneas convertidas a sort (después de lo cual usted puede entonces convertir los separadores de campo atrás):

sed 's/:/ /' freeswitch.log | sort -srk2,3 | sed 's/ /:/' 

Tenga en cuenta que los campos utilizados por la clave se cambian a 2,3, omitiendo el primer campo (nombre de archivo).

Cuestiones relacionadas