Próbuję pokazać wszystkie wystąpienia określonej wiadomości z syslog w porządku chronologicznym, wykonując coś takiego:
grep squiggle /var/log/messages*
Niestety wzorzec globu najpierw pasuje do aktualnie aktywnego pliku. na przykład.
/var/log/messages
/var/log/messages-20120220
/var/log/messages-20120227
/var/log/messages-20120305
/var/log/messages-20120312
Oznacza to, że najpierw pojawiają się najnowsze wiadomości, a następnie wiadomości historyczne w kolejności chronologicznej.
Czy można w jakiś sposób dostosować zachowanie wzorca globu, aby puste dopasowanie (tj. Po prostu messages
) pojawiło się na końcu listy?
Jeśli nie, jaki byłby dobry sposób rozwiązania tego problemu?
tac
:grep squiggle /var/log/messages* | tac
...Odpowiedzi:
Nie wiem, jak zmienić kolejność globowania, ale dla tej sprawy istnieje łatwe obejście:
tzn. nie pasuj do
messages
plików we wzorcu globu i dodaj go na końcugrep
listy argumentów.źródło
grep squiggle /var/log/messages{-*,}
. (Nazywany „rozszerzeniem nawiasu klamrowego”, jeśli chcesz google go.)W Zsh możesz kontrolować kolejność dopasowań (między innymi) za pomocą kwalifikatora glob .
(Więcej informacji znajdziesz w instrukcji). Możesz nawet zdefiniować własną kolejność sortowania, podając funkcję porównania w najnowszych wersjach za pomocą
oe
lubo+
.Tutaj właściwa kolejność plików to kolejność chronologiczna. Możesz go jednak łatwo emulować na podstawie nazwy i działa to nawet w bash:
źródło
Możesz użyć odwrotności w połączeniu z ls -tr (sortuj według czasu modyfikacji i odwrotnie) w następujący sposób:
źródło