ログファイルから現在時刻のX分を抽出します。

ログファイルから現在時刻のX分を抽出します。

次のタイムスタンプ形式のログファイルがあります。

2016-06-02 13:59:58.069

私が作業しているログは約1時間続きます。

2016-06-02 13:05:06.144
2016-06-02 13:05:06.144
2016-06-02 13:05:06.160
2016-06-02 13:05:06.160
2016-06-02 13:05:06.176
2016-06-02 13:05:06.177
.
.
.
.
2016-06-02 14:05:03.033
2016-06-02 14:05:03.034
2016-06-02 14:05:03.034
2016-06-02 14:05:03.084
2016-06-02 14:05:03.096
2016-06-02 14:05:03.112

awkを使用して最後の10分を抽出しようとすると、まだファイル全体を取得できます。

awk -vDate=`date -d'now-10 minutes' +%Y/%m/%d:%H:%M:%S` '$1,$2 >   Date {print Date, $0}' logfile.log | less

awk出力:

2016/06/02:08:57:35 2016-06-02 13:05:06.144
. 
.
.
2016/06/02:08:57:35 2016-06-02 14:08:05.214

私は何が間違っていましたか?

答え1

別の方法を使用してください。 vDate を使用してgrep行番号とtailその行番号のファイルをインポートします。

vDate=`date -d'now-10 minutes' '+%Y-%m-%d %H:%M'` 
line=`grep  -n "$vDate" logfile.log | head -1  | cut -d: -f1`
tail -n +${line} logfile.log

答え2

努力する

awk -vDate="`date -d'TZ="UTC" now-10 minutes' +'%Y-%m-%d %H:%M:%S.%3N'`" '$1" "$2 > Date {print Date, $0}'

スキーマでは、カンマは$1,$2 > Date出力のように「このフィールドを結合する」という意味ではありません。代わりに、パターンが次のようになります。記録範囲$1空ではない文字列なので、Alwaystrueマッチングはすぐに開始されます。比較する前にフィールドを結合するには、ここにリテラルスペースを入れる必要があります。$1" "$2

Date次に、サンプル出力で「2016/06/02:...」に設定し、ログで「2016-06-02...」を使用することがわかります。日付を比較するときひも、ASCII/以降、-テストは成功しません。正確に一致するように文字列形式を変更すると(シェルで保護するためにいくつかの引用符を追加)、数値のみが異なります。

編集する: ログファイルのタイムスタンプが表示されている時間より数時間遅れますdate -d'now-10 minutes'。環境変数()または日付文字列内で関連dateするタイムゾーンを使用できます。そうでない場合は、次の中から正しいものを選択してください。TZ=UTC awk ...'TZ="UTC" now...'UTC全リスト

答え3

awkstart_patternend_pattern次の構文を使用して、セクション内のテキスト行を使用して印刷できます。

$ awk '/start_pattern/, /end _pattern/' filename

から引用Linux シェルスクリプトマニュアル

したがって、次のようにすることができます。

awk '/2016-06-02 13:55/, /2016-06-02 14:05/' logfile`

必要に応じてスクリプトファイルに書き込むこともできます。

START=`date --date='now-10 minutes' '+%Y-%m-%d %H:%M'`
END=`date --date='now' '+%Y-%m-%d %H:%M'`
awk "/$START/, /$END/" logfile

関連情報