linux - 如何在 Linux 中 grep 特定时间戳范围内的日志文件内容?

标签 linux bash awk grep pattern-matching

我有一个日志文件,其中包含以下格式的数据

[1361991081] SERVICE NOTIFICATION: qreda;qa-hadoop1;CPU Load;CRITICAL;notify-service-by-email;CRITICAL - load average: 18.29, 18.14, 18.10
[1361991371] SERVICE NOTIFICATION: qreda;CRITICAL-SERVICES_FOR_LAST_24_HOURS;qa-hadoop1:Critical Services;CRITICAL;notify-service-by-email;CPU Load,Memory,
[1361994681] SERVICE NOTIFICATION: qreda;qa-hadoop1;CPU Load;CRITICAL;notify-service-by-email;CRITICAL - load average: 18.02, 18.06, 18.11
[1361994971] SERVICE NOTIFICATION: qreda;CRITICAL-SERVICES_FOR_LAST_24_HOURS;qa-hadoop1:Critical Services;CRITICAL;notify-service-by-email;CPU Load,Memory,

我包含过去 7 天的所有数据。我想 grep 这个文件以显示昨天的日志。这里日期显示为时间戳。我正在使用以下命令

cat /usr/local/nagios/var/nagios.log |grep qa-hadoop1|grep CRITICAL|grep NOTIFICATION | awk -F, '{ if ($1>"[1361989800]" && $1<"[1362076199]") print }'

哪里1361989800Thu Feb 28 00:00:00 IST 2013 的计算时间戳值

1362076199Thu Feb 28 23:59:59 IST 2013 的计算时间戳值.

这很有效,但问题是我如何通过 13619898001362076199作为参数??

最佳答案

您只需要awk为此。

awk -va=1361989800 -vb=1362076199 '{gsub(/[][]/,"")}/qa-hadoop1|CRITICAL|NOTIFICATION/&&$1>a&&$1<b' file

-v options 允许您传入变量。也可以使用gsub删除第一个字段上整数比较的括号(空格分隔而不是逗号)


注释:

grep读取文件,因此您不需要cat file | grep 'pattern'只是grep 'pattern' file您也可以使用类似 egrep 'qa-hadoop1|CRITICAL|NOTIFICATION' file 的交替所以你不需要通过管道连接到 grep三次。

更多awkish awk -F, '{ if ($1>"[1361989800]" && $1<"[1362076199]") print }' 的版本是 awk -F, '$1>"[1361989800]" && $1<"[1362076199]"'你不需要if awk 中的构造和默认 block 是打印。

关于linux - 如何在 Linux 中 grep 特定时间戳范围内的日志文件内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15154083/

相关文章:

java - Java通过终端执行外部程序

bash - 在我的 bash 循环遍历一些服务器的列表,如果 ssh 连接 bash 脚本退出

linux - 用管道替换 Bash 进程

json - jq - 无法在 while 循环中将对象 append 到数组

linux - 提取两个相同分隔符(多实例分隔符)之间的行

bash - 在 unix 命令行中删除文件的前 N ​​行

linux - 如何按路径对linux find命令进行排序

正则表达式判断字符串是否包含 linux 文件路径或 linux 文件路径是否作为字符串的一部分

linux - 更改 AWK 条件 block 内的 Shell 脚本变量值

python - 我如何自动化我用 python 编写的爬虫程序每月运行一次?