È possibile cambiare l'ordine di un glob?


12

Sto cercando di mostrare tutte le istanze di un particolare messaggio dal syslog in ordine cronologico facendo qualcosa del tipo seguente:

grep squiggle /var/log/messages*

Sfortunatamente il modello glob corrisponde prima al file attualmente attivo. per esempio.

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

Ciò significa che i messaggi recenti vengono visualizzati per primi, seguiti dai messaggi storici in ordine cronologico.

È possibile regolare il comportamento del modello glob in qualche modo per far apparire la corrispondenza vuota (cioè solo messages) alla fine dell'elenco?

In caso contrario, quale sarebbe un buon modo per affrontare questo problema?


2
È possibile invertire l'output utilizzando tac: grep squiggle /var/log/messages* | tac...
pbm

Risposte:


8

Non conosco un modo per cambiare l'ordine dei globbing, ma c'è una soluzione semplice per il tuo caso:

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

cioè non abbinare i messagesfile nel tuo modello glob e aggiungerlo alla fine grepdell'elenco degli argomenti.


Grazie per quello Ho reso il problema più complesso del necessario!
Burhan Ali,

1
O per ulteriore fantasia e meno ridondanza, utilizzare grep squiggle /var/log/messages{-*,}. (Chiamato "espansione bash brace" se si desidera cercarlo su Google.)
Carattere jolly

11

In zsh, puoi controllare l'ordine delle partite (tra le altre cose) con un qualificatore glob .

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)

(Consultare il manuale per ulteriori possibilità.) È anche possibile definire il proprio ordinamento fornendo una funzione di confronto nelle versioni recenti, con oeo o+.

Qui, l'ordine corretto dei file è l'ordine cronologico. Puoi emularlo facilmente in base al nome, tuttavia, e funziona anche in bash:

grep squiggle /var/log/messages{-*,}

Sono sempre più colpito da zsh più ne leggo.
Burhan Ali,

Posso ottenere file (in ordine) da zsh e passarli a bash?
Wowfunhappy,

@Wowfunhappy Sì, ma devi fare attenzione a trattare correttamente i caratteri speciali. Fai una nuova domanda.
Gilles 'SO- smetti di essere malvagio' il

2

Puoi usare i backtick combinati con ls -tr (ordina per mod time e al contrario) in questo modo:

grep squiggle `ls -tr /var/log/messages*`
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.