【问题标题】:How to capture logs which are one hour old or less如何捕获一小时或更短的日志
【发布时间】:2016-04-20 11:56:51
【问题描述】:

我必须制作一个 shell 脚本,以便每次执行它都会转到常见的日志文件并进行更新。已经在做的是挑选所有错误的日志并显示为输出。但现在我希望这就像它选择的日志是特定的几分钟而不是更多。

grep 适用于获取时间戳行。但是我该怎么做才能只获取新数据而不是太旧的数据。

grep -i error log.log |  grep `date +%Y'-'%m'-'%d`

日志文件格式如下:'[date in YYYY-mm-dd timestamp] - error/exception generated'

任何帮助将不胜感激。提前谢谢大家。

【问题讨论】:

  • 显示到目前为止您尝试了什么?并提供一些例子。..
  • 嗨@blackSmith。提供的例子。感谢观看
  • 抱歉@blackSmith 无法添加。但我会添加日志文件的格式。
  • tmp=$(date --date='60 minutes ago' +%s)
  • 张贴minimal reproducible example,以便我们尽力帮助您。

标签: shell unix grep unix-timestamp


【解决方案1】:

这有点棘手。 60 分钟前的日期将有助于 grep 查找恰好在 60 分钟前发生的条目,但不会帮助查找之后的内容。幸运的是,awk 可以很好地使用时间戳:

awk -F']' -v limit="[`date -d '60 minutes ago' +'%Y-%m-%d %H:%M:%S'`" '
    BEGIN {IGNORECASE=1} /error/ && $1 > limit' log.log

注意使用-F']' 将分隔符设置为],并在时间戳限制字符串的开头添加[。这意味着awk 实际上会比较时间戳,包括它们的左括号,例如"[2016-04-20 17:55:08",但没关系,它仍然有效。

不喜欢 awk?怎么样:

start=`date -d '60 minutes ago' '%Y-%m-%d %H:%M:%S'`
sort -d <(grep -i error log.log) <(echo "[$start") |
  sed -n "/$start/,$p" |
  grep -v "^\[$start$"

【讨论】:

  • grep 是完全没有必要的,useless。执行awk -options... '/error/ &amp;&amp; ($1 &gt; limit)' log.log 效率更高
  • 唉,awk 不适合时间戳。据我所知,strftime()systime() 函数仅存在于 gawk 中。如果您不了解 OP 的平台,最好要求澄清或使您的答案可移植。
  • +1 用于 awk 解决方案。仅使用 grep 是不可能的,但如果是 24 小时格式,则可以进行小时级别的处理。
  • 非常感谢@webb。我会尝试判断这是否适合我。
猜你喜欢
  • 1970-01-01
  • 2021-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-19
  • 2015-12-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多