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?


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.


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{-*,}

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*`
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.