Ist es möglich, die Reihenfolge eines Globus zu ändern?

12

Ich versuche, alle Instanzen einer bestimmten Nachricht aus dem Syslog in chronologischer Reihenfolge anzuzeigen, indem ich Folgendes mache:

grep squiggle /var/log/messages*

Leider stimmt das Glob-Muster zuerst mit der aktuell aktiven Datei überein. z.B.

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

Dies bedeutet, dass die letzten Nachrichten zuerst angezeigt werden, gefolgt von den historischen Nachrichten in chronologischer Reihenfolge.

Ist es möglich, das Verhalten des Glob-Musters so anzupassen, dass die leere Übereinstimmung (dh nur messages) am Ende der Liste angezeigt wird?

Wenn nicht, was wäre ein guter Weg, um dieses Problem anzugehen?

Burhan Ali
quelle
2
Sie könnten Reverse - Ausgang mit tac: grep squiggle /var/log/messages* | tac...
pbm

Antworten:

8

Ich kenne keine Möglichkeit, die Globbing-Reihenfolge zu ändern, aber es gibt eine einfache Lösung für Ihren Fall:

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

dh stimmen nicht mit den messagesDateien in Ihrem Glob-Muster überein und fügen Sie sie am Ende der grepArgumentliste hinzu.

Matte
quelle
Dank dafür. Hat das Problem komplexer gemacht, als es sein musste!
Burhan Ali
1
Oder verwenden Sie für zusätzliche Fantasie und weniger Redundanz grep squiggle /var/log/messages{-*,}. (Genannt "Bash Brace Expansion", wenn Sie es googeln möchten.)
Wildcard
11

In zsh können Sie die Reihenfolge der Übereinstimmungen (unter anderem) mit einem Glob-Qualifikator steuern .

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)

(Weitere Möglichkeiten finden Sie im Handbuch.) Sie können sogar Ihre eigene Sortierreihenfolge definieren, indem Sie in neueren Versionen eine Vergleichsfunktion mit oeoder bereitstellen o+.

Hier ist die richtige Reihenfolge der Dateien chronologisch. Sie können es jedoch leicht anhand des Namens emulieren, und das funktioniert auch in bash:

grep squiggle /var/log/messages{-*,}
Gilles 'SO - hör auf böse zu sein'
quelle
Zsh beeindruckt mich immer mehr, je mehr ich darüber lese.
Burhan Ali
Kann ich Dateien (in der Reihenfolge) von zsh abrufen und an bash zurückgeben?
Wowfunhappy
@Wowfunhappy Ja, aber Sie müssen vorsichtig sein, um Sonderzeichen richtig zu behandeln. Stellen Sie eine neue Frage.
Gilles 'SO- hör auf böse zu sein'
2

Sie können Backticks in Kombination mit ls -tr (nach Mod-Zeit sortieren und umgekehrt) wie folgt verwenden:

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