¿Es posible cambiar el orden de un globo?

12

Estoy tratando de mostrar todas las instancias de un mensaje particular del syslog en orden cronológico haciendo algo como lo siguiente:

grep squiggle /var/log/messages*

Desafortunadamente, el patrón global coincide primero con el archivo activo actualmente. p.ej.

/var/log/messages
/var/log/messages-20120220
/var/log/messages-20120227
/var/log/messages-20120305
/var/log/messages-20120312

Esto significa que los mensajes recientes aparecen primero seguidos de los mensajes históricos en orden cronológico.

¿Es posible ajustar el comportamiento del patrón global de alguna manera para que la coincidencia vacía (es decir, solo messages) aparezca al final de la lista?

Si no, ¿cuál sería una buena manera de abordar este problema?

Burhan Ali
fuente
2
Puede invertir la salida usando tac: grep squiggle /var/log/messages* | tac...
pbm

Respuestas:

8

No conozco una forma de cambiar el orden global, pero hay una solución fácil para su caso:

grep squiggle /var/log/messages-* /var/log/messages

es decir, no coincida con los messagesarchivos en su patrón global y agréguelo al final de grepla lista de argumentos.

Estera
fuente
Gracias por eso. ¡He estado haciendo el problema más complejo de lo necesario!
Burhan Ali
1
O para una fantasía extra y menos redundancia, use grep squiggle /var/log/messages{-*,}. (Llamado "expansión bash brace" si quieres googlearlo).
Comodín el
11

En zsh, puede controlar el orden de las coincidencias (entre otras cosas) con un calificador global .

echo /var/log/messages*        # usual lexicographic order
echo /var/log/messages*(On)    # reverse lexicographic order
echo /var/log/messages*(om)    # reverse chronological order (ascending mtime)
echo /var/log/messages*(Om)    # chronological order order (descending mtime)

(Consulte el manual para obtener más posibilidades). Incluso puede definir su propio orden de clasificación proporcionando una función de comparación en versiones recientes, con oeo o+.

Aquí, el orden correcto de los archivos es el orden cronológico. Sin embargo, puedes emularlo fácilmente en función del nombre, y eso funciona incluso en bash:

grep squiggle /var/log/messages{-*,}
Gilles 'SO- deja de ser malvado'
fuente
Zsh me impresiona cada vez más a medida que leo sobre él.
Burhan Ali
¿Puedo obtener archivos (en orden) de zsh y devolverlos a bash?
Wowfunhappy
@Wowfunhappy Sí, pero debes tener cuidado al tratar los caracteres especiales correctamente. Haz una nueva pregunta.
Gilles 'SO- deja de ser malvado'
2

Puede usar los backticks combinados con ls -tr (ordenar por tiempo de modificación y viceversa) de esta manera:

grep squiggle `ls -tr /var/log/messages*`
Sarel Botha
fuente