最近日志文件的别名

最近日志文件的别名

通常当我搜索日志时,会查找最近发生的事情。我最终在 bash 提示符下按 Tab 键来完成名称。

我最终做了 bash 别名,它使用日期算术来构建文件名。类似于以下内容

grep <test> `date '+localhost_access_log.%C%y-%2m-%2d.txt' -d "-3 days"` grep 400 `date '+localhost_access_log.%C%y-%2m-%2d.txt' -d "-2 days"` grep 400 `date '+localhost_access_log.%C%y-%2m-%2d.txt' -d "-1 days"` grep 400 `date '+localhost_access_log.%C%y-%2m-%2d.txt' -d "-0 days"`

有什么办法可以优化这个吗?理想情况下,我想创建多个别名来 grep 最近的三个文件,例如 localhost_access_log.2019-06-24.txt 或 api-2019-06-24-1.log,并且不喜欢日期命令代码重复。本质上是在寻找 bash 函数的帮助,该函数将根据我发送的模式返回 4 个最近的文件名,包括今天的日志文件,并且可以传递给 grep 命令

答案1

如果你不坚持bash,你可以很容易地zsh使用以下方法来做到这一点setopt extendedglob

grep <test> *(ND.om[1,4])

将 grep 遍历当前目录中的四个最新文件。

解释:

  • N- 打开“null glob”(如果 glob 模式不匹配,则默默地替换任何内容)
  • D- 打开“GLOB_DOTS”(也匹配“隐藏文件”)
  • .- 匹配纯文件
  • om- 按修改时间排序
  • [1-4]- 数组下标

一个纯粹的 bash 解决方案可能是这样的

grep test $(ls -1rt | tail -n 4)

(但这对于时髦的文件名会失败,例如带有嵌入空格的文件名。)

find . -maxdepth 1 -type f -name "pattern" -mtime -1 -exec grep test {} +

将 grep 遍历当前目录中名称匹配pattern且在最后一天内已修改的文件(可能超过四个,但也可能为零)。不过,它可以处理时髦的文件名。

答案2

这是一个bash基于简单的解决方案。它的工作原理是ls列出与给定通配符匹配的 N 个最新文件,假设每个日志文件都是一天的:

$ grep test $(ls -tr localhost_access_log.*.txt | tail -4)

如果这被视为解析 ls 输出的不明智情况,请改用:

$ grep test $(find . -name localhost_access_log.\*.txt -mtime -3d)

一般来说,重点是避免陷入日期算术中。只需运行grepN 个最近的文件即可。同样,正如您的问题所暗示的,这假设您的日志每天轮换一次。

相关内容