grepとawkを使用した日付のフィルタリング

grepとawkを使用した日付のフィルタリング

.bash_aliases私のファイルに次のエイリアスを作成しました。

alias auth="grep \"$(date|awk '{print $2,$3}')\" /var/log/auth.log |
            grep -E '(BREAK-IN|Invalid user|Failed|refused|su|Illegal)'"

これはおそらく次のとおりです。

  • 今日の日付を確認してください。
  • auth.log今日のニュースを入手するにはgrepを使用してください。
  • grep 今日のメッセージは、特定の文字列の警告メッセージを照合するために使用されます。

ただし、日付が2桁の場合にのみ機能します。なぜなら、日数 < 10 の前にゼロがないからです。

たとえば、date結果を実行して.outputにパイプし、awkawkは次のようにキャプチャしてgrepに送ります。dateSat Jan 1 04:56:10 GMT 2011$2$3

Jan 1

ただし、日付に数字が含まれている場合は、auth.log次のメッセージが表示されます。

Jan  1 00:44:57 linux su[21249]: pam_unix(su:session): session closed for user root

Janしたがって、その後に2つのスペースがありますが、私のgrepコマンドにはauth.logスペースが1つしかありません。Jan

追加スペースを許可するようにコマンドを変更するにはどうすればよいですか?

ベストアンサー1

date | awk ...を使用する代わりに、dateコマンドで書式指定子を使用して目的の書式を取得できます。date(1)マニュアルページによると、は%b月名の略語で、%e空白で埋められた日付であり、同じです%_d

次の日付コマンドは、必要な形式の文字列を提供する必要があります。

date "+%b %e"

書式指定子に別の文字を入れることもできるので、以下を使用する場合:

date "+^%b %e"

行の先頭の日付のみが一致するgrepパターンを取得します。これにより、ログメッセージセクションの日付が間違って一致するのを防ぐことができます。

Steven Dが指摘したように、単一の呼び出しでもこれを行うことができますgrep

auth()
{
    grep -E "$(date '+^%b %e')"'.*(BREAK-IN|Invalid|user|Failed|refused|su|Illegal)' /var/log/auth.log
}

見積もりに関するコメントに記載されている問題に基づいていくつかの変更を加えました。私の引用規則は、別々の単語を単一の単語にグループ化するときに一重引用符を使用し、メタ文字のシェル拡張を防止し、複数の単語文字列内で拡張したい場合にのみ二重引用符を使用することです。

元の回答のdate書式文字列は二重引用符で囲まれています。これは上記の規則に従って無効です。私は今それを変えました。編集grep文字列を二重引用符で囲みます。シェルメタ文字とgrep正規表現(RE)メタ文字の間に重複することが多く、ほとんど常にREをgrepで一重引用符で囲みたいので、二重引用符で囲みました。現在の文字列に一重引用符は必要ありませんが、このシェル関数が時間の経過とともに進化すると、将来の変更によって中断される可能性があります。

質問はエイリアスに入れるコマンドについて尋ねるため、この回答には追加レベルの引用符は表示されません。エイリアスの代わりにシェル関数を使用する方が簡単なので、この追加参照を処理する必要はありません。入れ子になった参照はすぐに混乱する可能性があるため、これを防ぐためにすべての手順を実行する必要があります。

日付をぼかすGillesの提案を使ってこれをシェル関数でテストしましたが、「私には適していました」。

おすすめ記事