É 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?


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.


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{-*,}

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*`
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.