我正在搜索日志文件,看它是否在两个不同时间之间包含某个字符串。即如果以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
语句的命令行中传递$current
和if
时,它实际上并没有读取它。这就好像我正在传递垃圾,所以它没有比较正确的日期,并将返回所有的行并退出0.
但是,如果我手动输入if
语句中的日期,即2016-11-10 06:45:00
为from
,2016-11-10 10:45:00
为current
,则返回正确的行在这两个日期之间然后我可以使用grep检查这些行是否包含foo
。
我真的不明白为什么我的代码不起作用,我无法手动输入日期,因为我需要能够根据我的需要在两个不同的时间之间通过更改{{1}来检查变量。
threshold
是我的日志中时间戳的格式,从每行的开头开始。
感谢。
答案 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的东西。