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

时间:2016-11-10 20:05:40

标签: bash awk grep gawk

我正在搜索日志文件,看它是否在两个不同时间之间包含某个字符串。即如果以foo2016-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语句的命令行中传递$currentif时,它实际上并没有读取它。这就好像我正在传递垃圾,所以它没有比较正确的日期,并将返回所有的行并退出0.

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

我真的不明白为什么我的代码不起作用,我无法手动输入日期,因为我需要能够根据我的需要在两个不同的时间之间通过更改{{1}来检查变量。

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

感谢。

1 个答案:

答案 0 :(得分:3)

您正在尝试使用bash展开变量单引号...运行s="string"; echo '$s'并且您将看到我的意思。

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

&#34;但这是awk&#34; ...的权利,所以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做的整洁事情有一些很好的了解。您可能能够在模式上使用&#34;拆分文件&#34;这里是为了减少你使用的命令数量,但无论哪种方式你都会学到关于awk的东西。