我有一个包含大量信息的日志文件,我只想解析该文件的内容,该文件的内容落在最后24小时内
文件中的每行以 Jan 31 13:13:02
等时间戳开头,然后具有日志消息。
我当前有一个批处理文件,可以找到这样的开始和结束时间
start=$(date +"%b %d %H:%M:%S" --date="-1 day")
end=$(date +"%b %d %H:%M:%S")
然后,我希望与grep -c "data_to_find"
一起使用这些时间来查找某个日志消息的出现数量,以便我稍后可以采取行动。
简而我在Linux系统上,没有任何使用SED,AWK,GREP等解决方案的问题。
如果不编写shell脚本(尤其是在未排序的情况下),这并不是那么简单。
我会尝试这样的事情以在1天前到现在(根据需要插入),然后grep -c
从输出中进行任何您想要的管道。请注意,以下假定日期格式类似于Jan 31 13:13:02
(月和天之间的2个空间)
#!/bin/bash
yest=$(date -d "1 days ago" '+%s')
today=$(date '+%s')
while read -r line; do
date=
[[ $line =~ ^[[:alpha:]]+[[:blank:]][[:blank:]][0-9]+[[:blank:]][0-9]+':'[0-9]+':'[0-9]+ ]] && date="${BASH_REMATCH[0]}"
[[ -n $date ]] && date=$(date -d "$date" '+%s')
[[ -n $date && $date -ge $yest && $date -le $today ]] && echo "$line"
done < logfile
这可能很棘手,因为如果当时没有日志输入,则可能不存在确切的一秒钟的时间。
另一种可能性可能是每次阅读日志中添加标记,然后只看最后一个标记后的条目。因此,当您阅读日志时,假设它称为" log.txt",您可以做:
echo marker >> log.txt
然后,当您想从最后一个标记开始读取日志时,您可以找到这样的最后标记:
LASTMARKER=$(grep -n marker log.txt | tail -1 | awk -F: '{print $1}')
并在此之后阅读所有内容:
sed -n "$LASTMARKER,$ p" log.txt
sed -n "/^${start}/,/^${end}/ { /${YourPattern}/ p}" | wc -l
awk当然可以在一个脚本中做到这一点。在SED中,计数有点复杂,因此使用wc
(比sed -n '$ ='
快一点)。YourPattern是一条正则套件,可与您的日志消息套件找到