É possível mudar a ordem de uma glob?

12

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 glob de alguma forma para fazer a correspondência vazia (ou seja, apenas messages) aparecer no final da lista?

Caso contrário, qual seria uma boa maneira de resolver esse problema?

Burhan Ali
fonte
2
Você pode reverter a saída usando tac: grep squiggle /var/log/messages* | tac...
pbm

Respostas:

8

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

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

ou seja, não combine os messagesarquivos no seu padrão glob e adicione-o ao final da greplista de argumentos.

Esteira
fonte
Obrigado por isso. Está tornando o problema mais complexo do que precisava!
22912 Burhan Ali
1
Ou para uma fantasia extra e menos redundância, use grep squiggle /var/log/messages{-*,}. (Chamado de "expansão de chave de bash", se você quiser pesquisá-lo no Google.) #
Wildcard
11

No zsh, você pode controlar a ordem das correspondências (entre outras coisas) com um qualificador 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 o manual para mais possibilidades.) Você pode até definir sua própria ordem de classificação, fornecendo uma função de comparação nas versões recentes, com oeou o+.

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

grep squiggle /var/log/messages{-*,}
Gilles 'SO- parar de ser mau'
fonte
Estou cada vez mais impressionado com o zsh quanto mais leio sobre isso.
Burhan Ali
Posso obter arquivos (em ordem) do zsh e passá-los de volta para o bash?
Wowfunhappy 20/01/19
@Wowfunhappy Sim, mas você precisa ter cuidado ao tratar caracteres especiais corretamente. Faça uma nova pergunta.
Gilles 'SO- stop be evil'
2

Você pode usar backticks combinados com ls -tr (classifique por tempo de modificação e ao contrário) da seguinte maneira:

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