É possível alterar a ordem de uma glob?

11

Estou tentando mostrar todas as instâncias de uma mensagem específica do syslog em ordem cronológica, fazendo algo como o seguinte:

grep squiggle /var/log/messages*

Infelizmente, o padrão glob corresponde primeiro ao arquivo ativo no momento. por exemplo.

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

Isso significa que as mensagens recentes aparecem primeiro, seguidas pelas mensagens históricas em ordem cronológica.

É possível ajustar o comportamento do padrão de glob de alguma forma para fazer a correspondência vazia (ou seja, apenas messages ) aparecer no final da lista?

Se não, qual seria uma boa maneira de resolver esse problema?

    
por Burhan Ali 13.03.2012 / 10:59

3 respostas

8

Não conheço uma maneira de alterar a ordem de globbing, mas há uma solução fácil para o seu caso:

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

i.e. não corresponde aos arquivos messages em seu padrão glob e o adiciona ao final da lista de argumentos de grep .

    
por 13.03.2012 / 12:14
11

No zsh, você pode controlar a ordem das correspondências (entre outras coisas) com um qualificador 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)

(Veja o manual para mais possibilidades.) Você pode até mesmo definir sua própria ordem de classificação, fornecendo uma função de comparação em versões recentes, com oe ou o+ .

Aqui, a ordem correta dos arquivos é ordem cronológica. Você pode emular facilmente com base no nome, e isso funciona mesmo no bash:

grep squiggle /var/log/messages{-*,}
    
por 13.03.2012 / 23:37
2

Você pode usar backticks combinados com ls -tr (classificar por mod time e reverso) assim:

grep squiggle 'ls -tr /var/log/messages*'
    
por 12.07.2016 / 18:31