我试图通过在 .log 文件中传递 shell 变量来从日志文件中提取时间范围awk
。这就是我的日志文件的样子。
2014-11-24 12:58:59.290 1.1.1.1 etc..
2014-11-24 13:58:59.290 2.2.2.2 etc..
2014-11-24 14:58:59.290 3.3.3.3 etc ..
2014-11-24 12:58:59.290 4.4.4.4 etc..
2014-11-24 15:58:59.290 4.4.4.4 etc..
假设我想提取 12 小时到 13 小时之间的时间范围。这是我写的 bash 脚本。
stime=12
etime=13
date_=2014-11-24
awk 'BEGIN {
a='$stime';b='$etime';d='$date_'; FS="[: ]"
}
{
if ( $1 == d && $2 >= a && $2 < b )
print $1 $2 $3
}' logfile.txt
我的输出应该是这样的。
2014-11-24 12:58:59.290 1.1.1.1 etc..
2014-11-24 12:58:59.290 4.4.4.4 etc..
我没有看到任何输出,也没有看到任何错误。我不知道出了什么问题。任何对此的帮助将不胜感激。谢谢
答案1
stime=12
etime=13
date=2014-11-24
awk -v a="$stime" -v b="$etime" -v d="$date" -F "[: ]+" '
{
if ( $1 == d && $2+0 >= a && $2+0 < b )
print $1,$2,$3
}' logfile.txt
这会产生输出:
2014-11-24 12 58
2014-11-24 12 58
笔记:
FS="[: ];"
导致字段分隔符设置为冒号或空格,后跟分号。该组合永远不会出现在输入文件中。在原始代码中,赋值
d='$date_';
导致d
值为1979
。这是因为,当在 awk 代码中引入时,该表达式2014-11-24
被解释为需要减法的数值表达式。使用 选项将 shell 变量传输到 awk 是一个很好的做法
-v
。 shell 和 awk 都需要正确的引用,并且该-v
选项允许我们一次处理这些引用问题。awk 能够根据上下文进行数字或字母比较。通过添加
+0
代码,我们确保 awk 正在进行数字比较。