关于你的问题我已经创建了虚拟日志,还要注意时间与我的时区密切相关。在运行脚本之前,我还显示了当前时间。是
$ cat file2
Mar 9 05:20:01 hostname CROND[PROC_#]: (user) CMD (/path/to/job/)
Mar 9 04:20:01 hostname CROND[PROC_#]: (user) CMD (/path/to/job/)
Mar 9 05:35:01 hostname CROND[PROC_#]: (user) CMD (/path/to/job/)
Mar 5 05:35:01 hostname CROND[PROC_#]: (user) CMD (/path/to/job/)
Mar 9 04:35:01 hostname CROND[PROC_#]: (user) CMD (/path/to/job/)
$ date
Wed Mar 9 05:40:10 IST 2016
$ ./script.bash
Mar 9 05:20:01 hostname CROND[PROC_#]: (user) CMD (/path/to/job/)
Mar 9 05:35:01 hostname CROND[PROC_#]: (user) CMD (/path/to/job/)
$
的script.bash
内容如下:
#!/bin/bash
while read -r line || [[ -n "$line" ]]
do
log_date_str="$(awk '{print $1" "$2" "$3}' <<< "$line")"
log_date="$(date -d "$log_date_str" +%s)"
[[ $(($(date +%s)-$log_date)) -le 3600 ]] && echo "$line"
done < "file2"
我们从日志文件中的日期,并把它转换成自Unix Epoch经过的秒数,也得到了来自命令当前日期时间相同的格式date +%s
注意+%s
就是这里的格式。 date -d dateString +%s
可用于将字符串解析为所需格式的日期。一旦我们有了这两个日期,我们只是减去它,然后找出那些结果差异小于3600秒(1小时);然后我们只打印出日志行。
取而代之的是文件名传递给while
循环的,你可以通过你的grep
谢谢,它很好用,你能解释一下“while read ...”这行吗? – wakinov
它逐行读取文件,使用'read' shell builtin,'help read'获取更多信息。简而言之,它会将每行文件读入一个名为'line'的变量(成功读取返回0退出代码),或者使用'[[-n line]]'检查'line'变量的长度是否不为0(这是需要的当行不结束换行符char('\ n'),例如:最后一行) – ritesht93