这个问题我觉得用 awk 比较好实现。我试了一个,不过没找到怎么直接处理这个非数字的月份问题,使用数组来做了一个转换,所以脚本长了一点。
下面是用 message 日志来做的测试,你可以换成你的日志文件来测试看看效果。
你可以更改 time_period 的值来达到想要其它时间内的日志。
# awk -F'[ :]+' 'BEGIN{time_period=53600; mon["Jan"] = 1; mon["Feb"] = 2; mon["Mar"] = 3; mon["Apr"] = 4; mon["May"] = 5; mon["Jun"] = 6; mon["Jul"] = 7; mon["Aug"] = 8; mon["Sep"] = 9; mon["Oct"] = 10; mon["Nov"] = 11; mon["Dec"] = 12; now=systime();}; now - mktime("2013 " mon[$1] " " $2 " " $3 " " $4 " " $5) <= time_period {print}' messagesAug 13 05:15:01 test ntpdate[26717]: the NTP socket is in use, exiting
Aug 13 05:25:01 test ntpdate[26782]: the NTP socket is in use, exiting
Aug 13 10:05:01 test ntpdate[29013]: the NTP socket is in use, exiting
Aug 13 10:10:01 test ntpdate[29076]: the NTP socket is in use, exiting
将你的输入放到awk 中 看看是否满足你的需求,例如:
awk '
gsub("^From[ ]=[ ]", "") {
from = $0;
}
gsub("^Subject[ ]=[ ]","") {
subject = $0;
print "From="from, ",Subject="subject
} ' input_file 1> result_file
这个问题不太适合用shell脚本,perl之类的脚本做这个工作会更高效一些,无论是开发效率还是运行效率。
用shell的话,tail命令是不合适的,根本不知道从哪行开始截,如果还要计算的话,那就把问题复杂化了。用tac命令就是了,tac logfile | {filter logic} | tac,假如日志文件是下面的格式:
19216801 - - [20/Jun/2013:17:41:48 +0800] "GET / >
以上就是关于如何在linux下用shell脚本编写实现这个功能:提取从现在到几个小时以前的的log记录全部的内容,包括:如何在linux下用shell脚本编写实现这个功能:提取从现在到几个小时以前的的log记录、SHELL 怎么取日志里面的不同行,并保存、如何用Shell截取nginx最近10分钟的日志等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)