Postfixメールログファイルから過去1時間に発生したログエントリを抽出する1行のコマンドを探しています。
に基づいてこの問題、提案されたコマンドを実行してみましたが、かなり長いです。私はこれを短縮/改善することを望んでいます。現在使用しているコマンドは次のとおりです。
awk -vDate1=`date -d'now-1 hour' +%H:%M:%S` -vDate2=`date -d'now-1 hour' +%d` '{ if ($3 > Date1 && $2 >= Date2) print $0}' /var/log/maillog
電子メールログのログ形式は次のとおりです。
Jan 18 05:55:44 smtp-out-01 postfix/smtpd[8748]: connect from server.com[1.2.3.4]
Jan 18 05:55:44 smtp-out-01 postfix/smtpd[8748]: 70CF214B4: client=server.com[1.2.3.4]
Jan 18 05:55:44 smtp-out-01 postfix/cleanup[8751]: 70CF214B4: message-id=<[email protected]>
Jan 18 05:55:44 smtp-out-01 postfix/qmgr[28134]: 70CF214B4: from=<[email protected]>, size=1806, nrcpt=1 (queue active)
過去1時間のアイテムを抽出する最も短く効率的な方法は何ですか?
答え1
journalctl -u postfix -S "$(date -d "-1 hour" +%Y"-"%m"-"%d" "%T)
-u を使用してサービス名を指定し、-S を使用して date コマンドで生成される「以降」の日付を指定します。
答え2
awk -v ldate="$( date +'%d %H-%M-%S' -d'1 hour ago' )" '$2 " " $3 >= ldate'
あなたが望むようにすれば可能になると思いますが、RomanPerekrestが言ったように、毎月の最初の時間には機能しません。
とにかく、変数をdate
日付と時刻に設定し、フィールド2 - 3の範囲を比較して、それより高いか遅いかどうかを確認します。接続に必要な間隔を追加するだけで、日付文字列が1つだけ必要です。
日付をより良い形式に変更し、ロガーをより便利に記録する形式(年を含む)に設定することをお勧めします。
答え3
残念ながら、前の文のどれも私には適用されません。
(Linux 4.4.0-142-一般 #168-Ubuntu)
私のバリエーション:
k=$(date -d '1 hour ago' +'%H') | egrep "^*$k:" ./my.log
答え4
i=`date -d "1 hour ago"| awk '{print $2}'`; j=`date -d "1 hour ago"| awk '{print $3}'`;k=`date -d "1 hour ago"| awk '{print $4}'`; awk -v i="$i" -v j="$j" -v k="$k" '$1 == i && $2 == j && $3 > k {print $0}' /var/log/maillog
変数i = =>に月を保存し、変数j = =>に日付を保存します。
期間を時間:分:秒の形式で変数k = =>に保存します。
私のスクリプトは現在の月、日を確認し、日付までの過去1時間の既存のログを確認します。
混乱した点があれば教えてください。