假设我的日志文件(log.txt)类似于
2014-01-01 22:30:30 something happened....
2014-01-01 22:30:31 something happened....
2014-01-01 22:30:41 something happened....
我想跟踪这个文件以显示最后一小时的日志,并继续跟踪..
IE
tail <some magic to specify last 1 hour> -f log.txt
那么输出是
2014-01-01 21:30:41 something happened....
...
2014-01-01 22:30:30 something happened....
2014-01-01 22:30:31 something happened....
2014-01-01 22:30:41 something happened....
有没有工具可以做到这一点?
答案1
您可以在 oneliner 中使用 grep 和 tail 的组合。
grep "2014-01-01 21:" log.txt; tail -f log.txt
它将打印从该小时开始的所有内容,并保持尾随。
或者您也可以使用 awk 打印从某个小时开始到文件结束的所有内容,并在其后继续跟踪,这将允许您在需要时跟踪最后几个小时。
awk '/2014-01-01 21:/' log.txt; tail -f log.txt
答案2
onehourago=$(date --date='1 hours ago' +"%b%e %H:%M:%S")
echo $onehourago | cat /var/log/auth.log - | sort | sed "1,/$onehourago/d"
没有 sed 命令的中间输出:
Aug 7 00:00:03 thinkpux CRON[25475]: pam_unix(cron:session): session closed for user stefan
Aug 7 00:17:01 thinkpux CRON[25504]: pam_unix(cron:session): session closed for user root
Aug 7 00:17:01 thinkpux CRON[25504]: pam_unix(cron:session): session opened for user root by (uid=0)
Aug 7 00:19:33
Aug 7 01:00:02 thinkpux CRON[25652]: pam_unix(cron:session): session opened for user stefan by (uid=0)
Aug 7 01:00:03 thinkpux CRON[25652]: pam_unix(cron:session): session closed for user stefan
Aug 7 01:17:01 thinkpux CRON[25885]: pam_unix(cron:session): session closed for user root
Aug 7 01:17:01 thinkpux CRON[25885]: pam_unix(cron:session): session opened for user root by (uid=0)
输出:
Aug 7 01:00:02 thinkpux CRON[25652]: pam_unix(cron:session): session opened for user stefan by (uid=0)
Aug 7 01:00:03 thinkpux CRON[25652]: pam_unix(cron:session): session closed for user stefan
Aug 7 01:17:01 thinkpux CRON[25885]: pam_unix(cron:session): session closed for user root
Aug 7 01:17:01 thinkpux CRON[25885]: pam_unix(cron:session): session opened for user root by (uid=0)
注意:首先我用 +"%b %e %H:%M:%S" 构建了日期(注意 %b 和 %e 之间的空白,但 echo 将两个空白压缩为一个。通过 sed 搜索似乎寻找两个空格并且找不到表达式,因此区分月份中的某一天是否有两位数或一位数是很复杂的,但是,排序似乎对多余/缺失的空格不可知,也许有一个 bash-switch 来防止压缩。 ?但是 - 你的日期格式不同,所以你不会受到影响,但我必须以某种方式测试这种方法,学习者可能会陷入同样的陷阱。
因此,总体想法是,要获取 1 小时前的日期/时间,请将其格式化为日志文件中的格式,将纯日期添加到日志文件中并对混合物进行排序,然后使用 sed 删除纯日期之前的任何内容。
记住和输入并不有趣,但您可以将其放入脚本和/或函数中。
答案3
答案4
grep
or 的问题awk
是,您总是需要读取整个文件并检查每一行。- 问题
tail
是,你不知道需要多少行。
所以,尝试tac
然后awk
用tail -f
.-n0
tac file \
| awk -F'[- :]' -v datefilter="$(date -d -1hour +%s)" 'mktime($1 OFS $2 OFS $3 OFS $4 OFS $5 OFS $6) < datefilter {exit} 1' \
| tac
tail -f -n0
(必须说的是,如果两个命令之间有新行,您可能会丢失它们)。