次のタイムスタンプ形式のログファイルがあります。
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
awk
start_pattern
end_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