(O+P)ut

アウトプット



(O+P)ut

エンジニアのアウトプット

【Linux】任意の時刻フォーマットから時間の範囲で行を切り出す方法

スポンサーリンク

はじめに

時刻データが保持されている行(例えば$1)を指定することで以下ワンライナーで値が切り出せるとのことですが

$ awk -F - '"開始時間" < $1 && $1 <= "終了時間"' /var/log/secure

ワンライナーでなくても柔軟に値を抜き出したいことがあります。

本記事ではgrepの正規表現とawkの行切り出しを組み合わせて任意の時刻フォーマットでもテキストから欲しい情報を切り出すスクリプトを用意しました。

環境情報

スクリプトの方針

今回は例えば以下のフォーマットだとします。

[yyyy-mm-ddThh:mm:ss.sss+0900]

2020年1月23日の11時12分13.456秒で時差が標準時から+9時間の場合は

[2020-01-23T11:12:13.346+0900]

と表示されるとします。

よってgrepで時刻データを入れれば

$ cat hoge.log | grep 2020-02-27T04:05:37
[2020-02-27T04:05:37.438+0900] ...
[2020-02-27T04:05:37.441+0900] ...
[2020-02-27T04:05:37.969+0900] ...

正規表現によって部分一致で該当時刻のデータが出力されます。

あとは該当行の行数を記録し、以下にて範囲のログを出力します。

スクリプト

以下のスクリプトで任意の時刻のデータを抜粋できます。

#!/bin/bash
start=`cat -n hoge.log | grep $1 | head -n 1 | sed -e 's/  */ /g' | cut -c 2- | cut -f1`
stop=`cat -n hoge.log | grep $2 | tail -n 1 | sed -e 's/  */ /g' | cut -c 2- | cut -f1`
cat hoge.log | awk '{if(start<=NR && NR <= stop) print $0}' start=$start stop=$stop

尚、hoge.logの時刻が昇順で並んでいることが前提ですのでそうなっていない場合はsortの前処理が必要です。

スクリプトとしては引数で開始時刻と終了時刻で検索をかけ、それぞれの先頭行と末尾の行でログを抽出します。

$ ./hoge.sh 2020-02-27T04:04:34 2020-02-27T04:04:39
[2020-02-27T04:04:34.531+0900] ...
[2020-02-27T04:04:34.541+0900] ...
[2020-02-27T04:04:37.438+0900] ...
[2020-02-27T04:04:37.441+0900] ...
[2020-02-27T04:04:37.969+0900] ...
[2020-02-27T04:04:37.973+0900] ...
[2020-02-27T04:04:39.782+0900] ...

ただし簡易的な作りのため、検索行が空の場合はstartやstopの値が空となるので想定外の動作となります。ご注意ください。

以上、ご参考になれば幸いです。