Linux shell脚本到tar.gzip日志文件超过1个月按月分组

时间:2015-08-06 06:18:44

标签: linux bash shell logging archive

我有一个充满各种应用程序日志的目录。 例如:

  

FailedAudit_20150101_000000.log FailedAudit_20150209_000000.log   FailedAudit_20150316_000000.log stats20150116.log stats20150224.log   FailedAudit_20150102_000000.log FailedAudit_20150210_000000.log   FailedAudit_20150317_000000.log stats20150117.log stats20150225.log   FailedAudit_20150103_000000.log RepoV4Error20150227.log

所有日志都有格式为YYYYMMDD的时间戳,但您也可以看到其他涉及的数字。

我的目标是编写一个可以定期运行的脚本来浏览此目录并执行以下操作: 对于所有超过1个月的日志文件,基于文件名时间戳

  • 每个月的文件(30~31个文件),tar.gz为一个文件
  • 将tar.gz文件标记为
  

App1_201508.tar.gz< - 包含所有30个日志文件   所以格式化AppnameYYYYMM.tar.gz

除时间戳外,日志文件应用程序名称是静态的。

我想有几种方法可以做到这一点,但我想从stackoverflow的伟大思想中收集想法,找到最简单的方法。

提前致谢

2 个答案:

答案 0 :(得分:1)

这是您更新后问题的第三个解决方案:

#!/usr/bin/env bash

LOGTYPES=$( ls *log* | sed -rn "s/([0-9]{6})[0-9]{2}.*$/\1/p" | sort -u )

# the sed command, item by item:
#
# s/ search and replace
# ([0-9]{6}) block of 6 digits, and store it
# [0-9]{2} followed by 2 more digits
# .*$ followed by any and all characters until the end of the input
# / replace all of that with
# \1 the first stored block (the 6 digits)
# /p print the output
#
# So this turns FailedAudit_20150101_000000.log into FailedAudit_201501

THIS_MONTH=$(date +%Y%m)
for LOG in $LOGTYPES; do
    MONTH=${LOG: -6} # Last 6 characters of the LOGTYPE are YYYYMM

    if [[ "$MONTH" -lt "$THIS_MONTH" ]]; then
        LOG_FILES=$(ls ${LOG}*)
        tar -czf ${LOG}.tar.gz ${LOG_FILES}
        RC=$? # Check whether an error occured
        if [[ "$RC" == "0" ]]; then
            rm ${LOG_FILES}
        fi
    fi
done

注意:这假设第一个8位数字块是日期戳,之后的所有内容与它要去的存档无关。

<强>更新 sed脚本不再输出不包含时间戳的文件。

答案 1 :(得分:-1)

这里,不确定是否workIg

#!/bin/bash
MONTH=$(date +%m)
OLDMONTH=$MONTH-1
for FILE in `ls $DIR`
do
    if [ ${FILE:-4:2} == $OLDMONTH]; then
        # do what you want with the file, it's one month old, eg add it to a list
    fi
done
# do what you want with the list, eg tar,... 

每天运行一次脚本,例如runwhen或cron