Можно ли изменить порядок глобуса?

12

Я пытаюсь показать все экземпляры определенного сообщения из системного журнала в хронологическом порядке, выполнив что-то вроде следующего:

grep squiggle /var/log/messages*

К сожалению, шаблон glob сначала совпадает с текущим активным файлом. например.

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

Это означает, что последние сообщения отображаются первыми, а за ними следуют исторические сообщения в хронологическом порядке.

Можно ли как-то настроить поведение шаблона глобуса, чтобы пустое совпадение (т.е. просто messages) отображалось в конце списка?

Если нет, то как бы решить эту проблему?

Бурхан Али
источник
2
Вы можете изменить вывод, используя tac: grep squiggle /var/log/messages* | tac...
pbm

Ответы:

8

Я не знаю, как изменить порядок заполнения, но для вашего случая есть простой обходной путь:

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

т.е. не сопоставляйте messagesфайлы в вашем шаблоне glob, и добавьте его в конец grepсписка аргументов.

Мат
источник
Спасибо за это. Делал проблему более сложной, чем она должна была быть!
Бурхан Али
1
Или для дополнительной фантазии и меньшей избыточности используйте grep squiggle /var/log/messages{-*,}. (Вызывается «расширение bash brace», если вы хотите, чтобы Google его.)
Wildcard
11

В zsh вы можете управлять порядком совпадений (среди прочего) с помощью квалификатора 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)

(Дополнительные возможности см. В руководстве.) Вы даже можете определить свой собственный порядок сортировки, предоставив функцию сравнения в последних версиях с помощью oeили o+.

Здесь правильный порядок файлов - это хронологический порядок. Вы можете легко эмулировать его, основываясь на названии, и это работает даже в bash:

grep squiggle /var/log/messages{-*,}
Жиль "ТАК - перестань быть злым"
источник
Я все больше впечатляюсь zsh, чем больше читаю об этом.
Бурхан Али
Могу ли я получить файлы (по порядку) из zsh и передать их обратно в bash?
Wowfunhappy
@Wowfunhappy Да, но вы должны быть осторожны, чтобы правильно обрабатывать специальные символы. Задайте новый вопрос.
Жиль "ТАК - перестань быть злым"
2

Вы можете использовать обратные пометки в сочетании с ls -tr (сортировка по времени мода и в обратном порядке) следующим образом:

grep squiggle `ls -tr /var/log/messages*`
Сарел Бота
источник