次のコードがあります。
$ awk -F'[]]|[[]' \
'$0 ~ /^\[/ && $2 >= "2014-04-07 23:00" { p=1 }
$0 ~ /^\[/ && $2 >= "2014-04-08 02:00:01" { p=0 }
p { print $0 }' log
ここでは、ある変数に「2014-04-07」を割り当て、別の変数に「23:00」を割り当てたいと思います。 $ varなどを使用してその値から入力を取得します。ハードコードされたタイムスタンプの代わりに変数を使用できるように上記のコードを変更するのに役立つ人はいますか?
元の質問へのリンクは次のとおりです。2つのタイムスタンプ間のログを抽出する方法。
答え1
-v
次のオプションを使用して変数をパラメータとして渡すことができます。
awk -F'[]]|[[]' -v var1="2014-04-07 23:00" -v var2="2014-04-08 02:00:01" \
'$0 ~ /^\[/ && $2 >= var1 { p=1 }
$0 ~ /^\[/ && $2 >= var2 { p=0 }
p { print $0 }' log
あるいは、ブロックに変数を設定することもできますBEGIN
。
awk -F'[]]|[[]' \
'BEGIN{var1="2014-04-07 23:00"; var2="2014-04-08 02:00:01"}
$0 ~ /^\[/ && $2 >= var1 { p=1 }
$0 ~ /^\[/ && $2 >= var2 { p=0 }
p { print $0 }' log
答え2
もちろん、フロントエンドを介してパイプに、バックエンドを介してファイルに、またはリダイレクトを介してstdin
変数をロードする別の方法があります。他の場所で何をしているかに応じて、作業を簡素化することもできます。awk
ゲジン
cat vars
2014-04-07 23:00[1
2014-04-08 02:00:01[0
cat log
[2014-04-06 23:00] Log line 1
[2014-04-07 23:00] Log line 2
[2014-04-07 23:00:01] Log line 3
[2014-04-08 02:00:01] Log line 4
ゲッツサークル
awk -F'[]]|[[]' '
FNR==NR{v[NR]=$1; pv[NR]=$2}
FNR!=NR{for (i=1; i<=length(v); i++) if ($2>=v[i]) p=pv[i]}
p && $0~/^\[/{print $0}' vars log
ガジュット
[2014-04-07 23:00] Log line 2
[2014-04-07 23:00:01] Log line 3
最も洗練されたソリューションではないかもしれませんが、コードを操作したり変数を追加したりすることなく、配列、文字列、またはファイルを作成して、必要に応じてログフィルタリングをオンまたはオフにすることができます。
ワンストップ店。
答え3
p
ここでは変数を分割したり使用したりする必要はありません。
awk -v start='2014-04-07 23:00' -v end='2014-04-08 02:00:01' '
'/^\[/ && $0 >= "["start && $0 < "["end' log