首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Awk和Grep查找日志文件中两次之间的行

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

Stack Overflow用户
提问于 2016-11-10 20:05:39
回答 1查看 1.3K关注 0票数 0

我正在搜索一个日志文件,看看它是否包含两个不同时间之间的某个字符串。也就是说,如果foo存在于以2016-11-10 06:45:002016-11-10 10:45:00的时间戳开头的行之间,那么threshold变量将设置介于之间的时间,例如,240将是4小时。

代码语言:javascript
复制
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语句的命令行中传递if$current时,它实际上并不是在读取它。就好像我在传递垃圾,所以它没有正确地比较日期,而是返回所有行并退出0。

但是,如果我在if语句中手动输入日期,即2016-11-10 06:45:00作为from2016-11-10 10:45:00作为current,那么它返回在这两个日期之间的正确行,然后我可以使用grep检查这些行是否包含foo

我真的不明白为什么我的代码不能工作,而且我不能手动输入日期,因为我需要能够根据我的需要通过更改threshold变量来检查两个不同的时间。

2016-11-10 06:45:00是在日志中格式化时间戳的方式,从每行的开头开始。

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-10 20:31:17

您正在尝试使用bash展开变量单引号..。运行s="string"; echo '$s',你就会明白我的意思。

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

“但这就是为什么”.对,所以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的知识。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40536113

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档