Est-il possible de changer l'ordre d'un glob?

12

J'essaie de montrer toutes les instances d'un message particulier du syslog dans l'ordre chronologique en faisant quelque chose comme ceci:

grep squiggle /var/log/messages*

Malheureusement, le modèle glob correspond d'abord au fichier actuellement actif. par exemple.

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

Cela signifie que les messages récents apparaissent en premier, suivis des messages historiques dans l'ordre chronologique.

Est-il possible d'ajuster le comportement du motif global d'une manière ou d'une autre pour que la correspondance vide (c'est-à-dire juste messages) apparaisse à la fin de la liste?

Sinon, quelle serait une bonne façon de résoudre ce problème?

Burhan Ali
la source
2
Vous pouvez inverser la sortie en utilisant tac: grep squiggle /var/log/messages* | tac...
pbm

Réponses:

8

Je ne connais pas de moyen de modifier l'ordre de globbing, mais il existe une solution de contournement facile pour votre cas:

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

c'est-à-dire qu'ils ne correspondent pas aux messagesfichiers de votre modèle global et les ajoutent à la fin de grepla liste des arguments.

Tapis
la source
Merci pour ça. J'ai rendu le problème plus complexe qu'il ne devait l'être!
Burhan Ali
1
Ou pour plus de fantaisie et moins de redondance, utilisez grep squiggle /var/log/messages{-*,}. (Appelé "extension bash brace" si vous voulez le google.)
Wildcard
11

Dans zsh, vous pouvez contrôler l'ordre des correspondances (entre autres) avec un qualificatif 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)

(Voir le manuel pour plus de possibilités.) Vous pouvez même définir votre propre ordre de tri en fournissant une fonction de comparaison dans les versions récentes, avec oeou o+.

Ici, l'ordre correct des fichiers est l'ordre chronologique. Vous pouvez l'émuler facilement en fonction du nom, et cela fonctionne même dans bash:

grep squiggle /var/log/messages{-*,}
Gilles 'SO- arrête d'être méchant'
la source
Je suis de plus en plus impressionné par zsh à mesure que j'en lis.
Burhan Ali
Puis-je obtenir des fichiers (dans l'ordre) de zsh et les renvoyer à bash?
Wowfunhappy
@Wowfunhappy Oui mais vous devez faire attention à traiter correctement les caractères spéciaux. Posez une nouvelle question.
Gilles 'SO- arrête d'être méchant'
2

Vous pouvez utiliser des raccourcis combinés avec ls -tr (trier par heure de modification et en sens inverse) comme ceci:

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