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).
¿El espacio es un delimitador común? – ajreal