我在搜索日志文件以查看它是否包含两个不同时间之间的某个字符串。即如果在以2016-11-10 06:45:00
和2016-11-10 10:45:00
的时间戳开始的行之间存在foo
,则threshold
变量设置之间的时间,例如240将是4小时。使用Awk和Grep查找日志文件中两次之间的行
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
但是我不知道为什么,但是当我在if
声明传递命令行$from
和$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
是如何在我的日志中格式化时间戳,从每行的开始处开始。
感谢。
这可能有助于:[Schwartzian变换](https://en.wikipedia.org/wiki/Schwartzian_transform) – Cyrus
你不需要'if ...;然后退出0;其他出口1; fi'构造:如果你不这么做,你的脚本将以grep的退出状态退出。 –