グロブの順序を変更することは可能ですか?


12

次のようなことを行って、syslogから特定のメッセージのすべてのインスタンスを時系列順に表示しようとしています。

grep squiggle /var/log/messages*

残念ながら、globパターンは現在アクティブなファイルと最初に一致します。例えば。

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

これは、最近のメッセージが最初に表示され、その後に時系列で履歴メッセージが表示されることを意味します。

どうにかしてグロブパターンの振る舞いを調整して、空の一致をmessagesリストの最後に表示することは可能ですか?

そうでない場合、この問題に対処する良い方法は何でしょうか?


2
あなたは使用して出力を逆転できるtacgrep squiggle /var/log/messages* | tac...
PBM

回答:


8

グロビングの順序を変更する方法はわかりませんが、あなたの場合には簡単な回避策があります:

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

つまりmessages、globパターンのファイルと一致せず、それをgrepの引数リストの最後に追加します。


ありがとう。問題を必要以上に複雑にしています!
バーハンアリ

1
または、余分な空想性と少ない冗長性のために、を使用しますgrep squiggle /var/log/messages{-*,}。(グーグルで検索する場合は、「bash brace expansion」と呼ばれます。)
ワイルドカード

11

zshでは、(特に)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)

(その他の可能性については、マニュアルを参照してください。)oeまたはで最新バージョンの比較関数を提供することにより、独自のソート順を定義することもできますo+

ここでは、ファイルの適切な順序は時系列です。ただし、名前に基づいて簡単にエミュレートでき、bashでも機能します。

grep squiggle /var/log/messages{-*,}

私はそれについて読むほどzshにますます感銘を受けています。
バーハンアリ

zshから(順番に)ファイルを取得してbashに戻すことはできますか?
Wowfunhappy

@Wowfunhappyはい。ただし、特殊文字を正しく処理するように注意する必要があります。新しい質問をします。
ジル 'SO-悪であるのをやめる'

2

次のように、ls -tr(mod timeでソートし、逆順で)と組み合わせてバックティックを使用できます。

grep squiggle `ls -tr /var/log/messages*`
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.