You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写Shell脚本删除15天以上含PII数据的日志

嘿,我来帮你搞定这个Shell脚本的需求!要删除存储超过15天且包含PII的日志文件,我们得兼顾两个条件:文件过期,且里面有敏感的个人信息。下面是具体的实现思路和可直接用的脚本示例:

核心思路

我们的脚本需要完成三个关键步骤:

  • 定位所有修改时间超过15天的日志文件:用find命令的-mtime +15参数实现,它会匹配修改时间在15天前的文件
  • 检查文件是否包含PII:用grep结合正则表达式匹配常见的敏感信息(比如邮箱、手机号、身份证号等)
  • 删除符合双重条件的文件:先通过echo测试确认,没问题再执行真实删除
基础版脚本(带详细注释)

这个版本适合文件名没有空格或特殊字符的场景,注释清晰,容易理解:

#!/bin/bash

# 替换成你的实际日志存储目录
LOG_DIR="/var/log/your_app"

# 定义PII匹配规则,可根据你的敏感数据类型调整正则
# 这里包含了:邮箱、国内手机号、18位身份证号(含X/x)
PII_PATTERNS="\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b|\b(?:\+?86)?1[3-9]\d{9}\b|\b\d{17}[\dXx]\b"

# 遍历所有过期的日志文件
find "$LOG_DIR" -type f -name "*.log" -mtime +15 | while read -r LOG_FILE; do
    # 检查文件是否包含PII,-q表示静默模式,找到匹配就返回成功
    # -m 1表示找到第一个匹配就停止,提升大文件的处理效率
    if grep -qE -m 1 "$PII_PATTERNS" "$LOG_FILE"; then
        # 测试阶段用echo输出要删除的文件,确认无误后替换成rm -f
        echo "即将删除包含PII的过期日志:$LOG_FILE"
        # rm -f "$LOG_FILE"
    fi
done
更健壮的版本(支持特殊文件名)

如果你的日志文件名可能包含空格、引号等特殊字符,上面的while read可能会出问题,推荐用find -exec的方式,更安全:

#!/bin/bash

LOG_DIR="/var/log/your_app"
PII_PATTERNS="\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b|\b(?:\+?86)?1[3-9]\d{9}\b|\b\d{17}[\dXx]\b"

# 用find -exec批量处理文件,避免特殊文件名的问题
find "$LOG_DIR" -type f -name "*.log" -mtime +15 -exec sh -c '
    # 遍历传入的每个文件
    for file do
        if grep -qE -m 1 "$0" "$file"; then
            echo "删除符合条件的日志:$file"
            # rm -f "$file"
        fi
    done
' "$PII_PATTERNS" {} +
关键注意事项
  • 先测试再删除:一定要先保留echo语句运行脚本,确认输出的文件都是你想要删除的,再替换成rm -f,避免误删重要数据
  • 调整PII正则:上面的正则只是常见示例,如果你有其他类型的PII(比如护照号、银行卡号),需要补充对应的匹配规则
  • 添加审计日志:可以在删除时记录操作日志,方便后续审计,比如在rm前加一行:echo "$(date '+%Y-%m-%d %H:%M:%S'): 删除文件 $file" >> /var/log/pii_log_cleanup.log
  • 权限问题:确保运行脚本的用户有日志目录的读权限和删除权限,否则会报错

内容的提问来源于stack exchange,提问作者Bhavya Ch

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 07:27:48