如何编写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
相关产品推荐
相关产品推荐

