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?
tac
:grep squiggle /var/log/messages* | tac
...Antworten:
Ich kenne keine Möglichkeit, die Globbing-Reihenfolge zu ändern, aber es gibt eine einfache Lösung für Ihren Fall:
dh stimmen nicht mit den
messages
Dateien in Ihrem Glob-Muster überein und fügen Sie sie am Ende dergrep
Argumentliste hinzu.quelle
grep squiggle /var/log/messages{-*,}
. (Genannt "Bash Brace Expansion", wenn Sie es googeln möchten.)In zsh können Sie die Reihenfolge der Übereinstimmungen (unter anderem) mit einem Glob-Qualifikator steuern .
(Weitere Möglichkeiten finden Sie im Handbuch.) Sie können sogar Ihre eigene Sortierreihenfolge definieren, indem Sie in neueren Versionen eine Vergleichsfunktion mit
oe
oder bereitstelleno+
.Hier ist die richtige Reihenfolge der Dateien chronologisch. Sie können es jedoch leicht anhand des Namens emulieren, und das funktioniert auch in bash:
quelle
Sie können Backticks in Kombination mit ls -tr (nach Mod-Zeit sortieren und umgekehrt) wie folgt verwenden:
quelle