【问题标题】:Linux Script to remove lines that match datesLInux 脚本删除匹配日期的行
【发布时间】:2022-01-26 18:04:14
【问题描述】:

我有一个日志文件,其中包含如下格式的行。我正在尝试在 linux 中创建一个脚本,该脚本将删除比当前日期早 x 天的行。谢谢你的帮助。

Wed Jan 26 10:44:35 2022 : Auth: (72448)   Login incorrect (mschap: MS-CHAP2-Response is incorrect): [martin.zeus] (from client CoreNetwork port 0 via TLS tunnel)    
Wed Jan 16 10:45:32 2022 : Auth: (72482) Login OK: [george.kye] (from client CoreNetwork port 5 cli CA-93-F0-6C-7E-77)

【问题讨论】:

  • 你能分享你的尝试吗?它可能有助于建立这一点以及您将如何解决这个问题,因为可以使用pythonawksedbash
  • 还有一个愚蠢的问题......你为什么不让logrotate 为你解决这个问题?为什么要尝试重新发明轮子(很可能很糟糕)?
  • 谢谢你。我认为 logrotate 不是一个选项,因为这是在 Synology nas 上。原来它是默认安装的。

标签: linux script


【解决方案1】:

我认为你应该看看logrotateKibana & Elastic search 来解析和过滤日志。

尽管如此,我制作了一个简单的脚本,它只打印从作为参数传递的那一天到当前日期的条目,

例如这将仅打印自过去 5 天以来的日志。 bash filter.sh log.txt 5

#!/usr/bin/env bash

file="${1}"
days="${2:-1}"

epoch_days=$(date -d "now -${days} days" +%s)

OFS=$IFS
IFS=$'\n'
while read line; do
    epoch_log=$(date --date="$(echo $line | cut -d':' -f1,2,3)" +%s)
    if [ ${epoch_log} -ge ${epoch_days} ]; then
        echo ${line}
    fi
done < ${file}
IFS=$OFS

【讨论】:

  • 喜欢这种方法。一些提示。在[ ... ] 中始终使用双引号变量。总是双引号文件名(您的用户可能会做一些愚蠢的事情,比如在其中包含空格)此外,ALLCAPS 中的变量通常保留用于系统和环境变量。另外,强调您的解决方案是 bash 解决方案。 ($'\n' 是一种 bashism)不清楚标签 [linux] 和 [script] 中的 shell 是什么。尽管如此,付出了很大的努力,仍然值得为此点头。
  • 感谢 rcedillo。这也有效。
猜你喜欢
  • 2010-09-19
  • 2014-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-30
  • 1970-01-01
  • 2017-10-20
相关资源
最近更新 更多