我正在尝试使用 grep 在日志文件中寻找模式,但我需要日志文件的最后一小时。tail -n XX 不起作用。有人知道这是否可行吗?某种跟踪“过去一小时内从日志文件中写入的行”
如果有任何命令或程序,我将不胜感激。
多谢
答案1
假设您的日志具有以下结构:
219.369.42.449 - - [05/Mar/2020:11:05:17 +0200] "log line"
219.369.42.449 - - [05/Mar/2020:11:06:37 +0200] "log line"
219.369.42.449 - - [05/Mar/2020:12:01:14 +0200] "log line"
219.369.42.449 - - [05/Mar/2020:12:07:23 +0200] "log line"
我们可以使用以下方式获取从第一次出现到文件05/Mar/2020:11
末尾的所有行:$
sed
sed -n '/05\/Mar\/2020:11/,$p' "/path/to/file.log"
该选项
-n
将抑制的正常输出sed
,但该标志p
将打印文件的匹配部分。请注意,如果没有显示任何与之匹配的记录
05/Mar/2020:11
,sed
则不会提供任何输出。
我们可以借助以下命令自动执行上述操作date
:eval
COMMAND="sed -n '/$(LANG=C date --date='1 hour ago' "+%d\/%b\/%Y:%H")/,\$p'"
eval $COMMAND \"/path/to/file.log\"
sed
在这种情况下,在表达式中使用双引号和变量不会提供所需的输出。- 因此我们首先将命令构建为字符串,然后通过将其转换为真实命令
eval
。 LANG=C
(LANG=en_us_88591
) 代表获取所需的日期格式,因为,例如,在我的情况下,这个环境变量的默认值是bg_BG.UTF-8
。
您可以根据以上两行创建一个脚本 - 该脚本的示例:
modsecurity-whitelist-rule-generator.bash
- 解析事件在 ModSecutitymodsec_audit.log
中他们的唯一标识,然后为 ModSecutity 生成白名单规则。
答案2
tail 没有命令或选项可以跟踪过去一小时的变化。您必须在日志中 grep 时间戳,或者继续tail -f
运行,当需要检查某些内容时只需向后滚动即可。这样做的好处是,您还可以捕获 61 分钟前发生的事件。
答案3
每 5 分钟运行一次命令时,还要复制一份日志文件。然后,您可以从制作的倒数第 12 个副本中进行差异分析,以获取当前更改。
答案4
利用 @pa4080 用来获取一小时前的日期命令。将其传递给 awk 脚本,该脚本查找包含正确年、月、日以及匹配的小时和更高的分钟或更高的小时的第一行。从第一行到文件末尾的输出。
我的 awk 不是那么强大,否则我会为你编写它。希望其他人能成为你的 awk 大师。