使用 AWK 从日志文件中提取时间范围

使用 AWK 从日志文件中提取时间范围

我试图通过在 .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

笔记:

  1. FS="[: ];"导致字段分隔符设置为冒号或空格,后跟分号。该组合永远不会出现在输入文件中。

  2. 在原始代码中,赋值 d='$date_';导致d值为1979。这是因为,当在 awk 代码中引入时,该表达式2014-11-24被解释为需要减法的数值表达式。

  3. 使用 选项将 shell 变量传输到 awk 是一个很好的做法-v。 shell 和 awk 都需要正确的引用,并且该-v选项允许我们一次处理这些引用问题。

  4. awk 能够根据上下文进行数字或字母比较。通过添加+0代码,我们确保 awk 正在进行数字比较。

相关内容