代码之家  ›  专栏  ›  技术社区  ›  user3128376

使用Awk和Grep查找日志文件中两次之间的行

  •  0
  • user3128376  · 技术社区  · 9 年前

    foo 存在于以时间戳开始的行之间 2016-11-10 06:45:00 2016-11-10 10:45:00 这个 threshold

    current="$(date "+%Y-%m-%d %H:%M:%S")"
    threshold=240
    dt_format="+%Y-%m-%d %H:%M:%S"
    from="$(date -d "$threshold minutes ago" "$dt_format")"
    
    if awk '$0 >= "$from" && $0 <= "$current"' /path/file.log | grep "foo"
    then
       exit 0
    else
       exit 1
    fi
    

    然而,我不知道为什么,但当我通过 $from $current if 声明,它实际上并没有读它。这就好像我在传递垃圾,所以它没有正确比较日期,将返回所有行并退出0。

    但是如果我手动在 如果 声明,即。 from 2016-11-10 10:45:00 current 然后它返回这两个日期之间的正确行,然后我可以使用grep检查这些行是否包含 .

    我真的不明白为什么我的代码不工作,我不能手动输入日期,因为我需要能够根据我的需要在两个不同的时间之间进行检查 门槛 变量

    是时间戳在日志中的格式,从每行的开头开始。

    谢谢

    1 回复  |  直到 9 年前
        1
  •  3
  •   A Brothers    9 年前

    您正在尝试让bash展开变量、单引号…运行 s="string"; echo '$s'

    所以 '$0 >= "$from" && $0 <= "$current"' 字面上的意思是那些确切的字符。这可能不是你想要的。

    “但这是awk的论点”…对,所以awk知道如何处理$0和$1,所以awk正在适当地扩展它们。但你期待着awk会得到 '$0 >= "some_time" && $0 <= "Some_other_time"' 但它没有!

    因此,向awk传递变量的方式是 some_variable="world"; awk -v my_variable=$some_variable 'BEGIN{print "hello", my_variable}'

    所以你应该 if awk -v f="$from" -v c="$current" '$0 >= f && $0 <= c' /path/file.log | grep "foo"

    退房 http://www.catonmat.net/blog/ten-awk-tips-tricks-and-pitfalls/ 本文实际上深入了解了使用awk可以做的整洁的事情。你 可以 可以在这里使用“模式上的分割文件”来减少您使用的命令数量,但无论哪种方式,您都将了解有关awk的一些信息。

    推荐文章