【问题标题】:Find multiple strings in a file and email on occurence of any defined string在出现任何定义的字符串时在文件和电子邮件中查找多个字符串
【发布时间】:2012-02-19 21:27:18
【问题描述】:

我想编写一个 shell 脚本,它可以从给定的日志文件(例如 /var/log/messages)中找到多个字符串(例如“错误|通知|警告”)的出现。如果任何字符串匹配,它应该向指定的邮件 ID 发送邮件通知。

我可以使用:

grep -i -E '^Errors|Notice|Warnings' /var/log/messages

但我的主要问题是,日志文件总是在增长,如果我想在 cron 中添加这个脚本,我如何记录我在上次执行脚本时已经检查过的文件行或内容?

例如,如果日志文件是 100 行,并且我已经使用 cat 或类似方法读取了该文件,那么在第二次执行之前,该文件变为 300 行,那么现在我想从 101 行号读取到 300。

谁能建议我如何录制这个?

【问题讨论】:

    标签: bash shell grep cat


    【解决方案1】:

    您可以使用以下脚本来执行此操作:

    start=0
    
    [[ -f last-processed ]] && start=$(<last-processed)
    
    start=$((start+1))
    
    tail +$start /var/log/messages | grep -i -E 'Errors|Notice|Warnings' &&\
    wc -l /var/log/messages | awk '{print $1}' > last-processed
    

    顺便说一句,你的正则表达式有问题,应该是 'Errors|Notice|Warnings' 而不是 '^Errors|Notice|Warnings'

    【讨论】:

    • 如果你真的只想要“错误”、“警告”或“通知”开头的行,那么:grep -iE "^(Error|Notice|Warning)"。
    【解决方案2】:

    轮换您的日志文件可能是最好的解决方案。

    但是如果你想将文件从line_first grep 到line_last 你可以使用sed:

    例如,从输入流中获取 100 到 110 的行:

    $> line_first=100; line_last=110
    $> seq 1 1000 | sed -n "${line_first},${line_last}p"
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    

    【讨论】:

      猜你喜欢
      • 2015-04-18
      • 2013-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 2013-08-25
      相关资源
      最近更新 更多