如何在linux下用shell脚本编写实现这个功能:提取从现在到几个小时以前的的log记录

如何在linux下用shell脚本编写实现这个功能:提取从现在到几个小时以前的的log记录,第1张

这个问题我觉得用 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}' messages

  Aug 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分钟的日志等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9873378.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存