Czy można zmienić kolejność globów?

12

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?

Burhan Ali
źródło
2
Możesz odwrócić wyjście, używając tac: grep squiggle /var/log/messages* | tac...
pbm

Odpowiedzi:

8

Nie wiem, jak zmienić kolejność globowania, ale dla tej sprawy istnieje łatwe obejście:

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

tzn. nie pasuj do messagesplików we wzorcu globu i dodaj go na końcu greplisty argumentów.

Mata
źródło
Dziękuję za to. Sprawiłem, że problem stał się bardziej złożony, niż trzeba!
Burhan Ali,
1
Lub w celu uzyskania dodatkowego wrażenia i mniejszej nadmiarowości, użyj grep squiggle /var/log/messages{-*,}. (Nazywany „rozszerzeniem nawiasu klamrowego”, jeśli chcesz google go.)
Wildcard
11

W Zsh możesz kontrolować kolejność dopasowań (między innymi) za pomocą kwalifikatora 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)

(Więcej informacji znajdziesz w instrukcji). Możesz nawet zdefiniować własną kolejność sortowania, podając funkcję porównania w najnowszych wersjach za pomocą oelub o+.

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:

grep squiggle /var/log/messages{-*,}
Gilles „SO- przestań być zły”
źródło
Im bardziej czytam o tym, tym bardziej jestem pod wrażeniem Zsh.
Burhan Ali,
Czy mogę pobrać pliki (w kolejności) z Zsh i przekazać je z powrotem do bash?
Wowfunhappy
@Wowfunhappy Tak, ale musisz uważać, aby traktować znaki specjalne poprawnie. Zadaj nowe pytanie
Gilles „SO- przestań być zły”
2

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:

grep squiggle `ls -tr /var/log/messages*`
Sarel Botha
źródło