接着上一篇文章-Linux Trace机日志可视化查找工具,笔者今天想着利用脚本来实现给定日期和时间定位到日志文件的功能。上一篇文章中笔者提到两个方法实现,但是利用脚本来定位更加方便,效率会更加高。
日志的文件名是按顺序命名的,那么定位日志文件就需要根据文件日期,简而言之就是查找某个时间点后的第一个文件。
能够查看时间的指令有以下有几种:
1、ls -l 。罗列文件,默认查看的就是mtime,即文件的最近修改时间。
2、 stat -c %n/%y * 。可以通过stat --help查看指令参数的含义,%y代表time of last modification,和ls -l是一样的,%n代表显示文件名。
既然有文件的最近修改时间,那么还有其他时间吗?可以通过stat指令来查看文件的三个时间。
Access Time:简写为atime,表示文件的访问时间;
Modify Time:简写为mtime,表示文件内容的修改时间;
Change Time:简写为ctime,表示文件的状态时间,当文件的状态权限被修改时间。
mtime,表示文件内容的修改时间是用来定位日志文件的时间,那么给定一个时间后,怎么查找到对应的日志文件呢。比如下面的几个文件,笔者需要找时间点:2021-4-4 10:34:00 的日志,需要脚本找到时间点后面的第一个文件,即10:38的44.log.gz。
可以使用find指令,参数 mtime指定时间(以天为单位)内文件被修改过是不符合定位要求的,可以使用newermt来精确定位到秒,需要注意的是newermt的时间是由固定格式的,2021-4-4 也可以写成2021/4/4,时间要使用:可以不写时分秒,只保留日期,即为查找这个日期下的文件。
find /home/mycentos/mylog/*.log.* -type f -newermt '2021-4-4 10:34:00'
这个时间点后的文件找到了,需要按照时间倒叙排列,最后使用管道符送给awk选出第一个文件。参数-tr就是按照修改时间倒叙排列。
ls -tr $(find /home/mycentos/mylog/*.log.* -type f -newermt '2021-4-4 10:40:00') | awk 'NR==1'
看一下笔者的测试效果:
最后笔者将这条命令写成脚本方便labview调用,log_search。注意,newermt后面的单引号笔者换成了双引号,因为里面有参数,双引号会把变量解析之后再输出,单引号是直接输出。
#!/usr/bin/bash
if [ $# -lt 1 -o $# -gt 2 ]
then
echo "Usage:"
echo "命令格式错误,只支持两个参数;第一个参数为日期,第二个参数为时间"
echo "Demos:$0 2020-4-1 10:10:00 ;$0 2020/4/1 10:10 ;$0 2020-4-1"
exit 1
fi
log_date="$1"
log_time="$2"
ls -tr $(find /home/mycentos/mylog/*.log.* -type f -newermt "$log_date $log_time") | awk 'NR==1'
网友评论