我有如下代码:
$ 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