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 或类似的东西)。有人可以帮我修改上面的代码,这样我就可以使用变量而不是硬编码时间戳。

以下是原始问题的链接如何提取两个时间戳之间的日志

答案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

相关内容