我正在搜索一个日志文件,看看它是否包含两个不同时间之间的某个字符串。也就是说,如果foo存在于以2016-11-10 06:45:00和2016-11-10 10:45:00的时间戳开头的行之间,那么threshold变量将设置介于之间的时间,例如,240将是4小时。
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作为from,2016-11-10 10:45:00作为current,那么它返回在这两个日期之间的正确行,然后我可以使用grep检查这些行是否包含foo。
我真的不明白为什么我的代码不能工作,而且我不能手动输入日期,因为我需要能够根据我的需要通过更改threshold变量来检查两个不同的时间。
2016-11-10 06:45:00是在日志中格式化时间戳的方式,从每行的开头开始。
谢谢。
发布于 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的知识。
https://stackoverflow.com/questions/40536113
复制相似问题