awkで変数に値を割り当てる方法

awkで変数に値を割り当てる方法

次のコードがあります。

$ 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

関連情報