Hadoop HDFS删除文件时排除指定年月备份的grep/awk实现方法
解决方案
1. 参数初始化(自动处理跨年场景)
首先生成可复用的年月参数,无需手动修改,自动处理1月时上月为去年12月的跨年场景:
# 获取当前年月 CURRENT_YEAR=$(date +%Y) CURRENT_MONTH=$(date +%m) # 获取上月年月 LAST_YEAR=$(date -d "last month" +%Y) LAST_MONTH=$(date -d "last month" +%m)
2. 匹配规则说明
你代码中SOMETHING部分使用grep反向匹配规则即可,核心逻辑是排除当月和上月的年月组合,完整规则为:-vE "${CURRENT_YEAR}-${CURRENT_MONTH}|${LAST_YEAR}-${LAST_MONTH}"
参数说明:
-v:grep反向匹配,只输出不包含指定模式的行-E:启用扩展正则表达式,支持|表示多模式或匹配
3. 完整可运行脚本
修正原for循环的语法问题后,完整脚本如下:
# 生成年月参数 CURRENT_YEAR=$(date +%Y) CURRENT_MONTH=$(date +%m) LAST_YEAR=$(date -d "last month" +%Y) LAST_MONTH=$(date -d "last month" +%m) # 遍历删除非当月、非上月的符合规则文件 for k in $(hdfs dfs -ls /temis_sesions_ip/bkp-cgnat/CDR_IP2MSISDN_CYO-CGN-CC-*.csv.gz \ | grep -vE "${CURRENT_YEAR}-${CURRENT_MONTH}|${LAST_YEAR}-${LAST_MONTH}" \ | awk '{print $8}') do hadoop fs -rm "$k" done
4. 增强严谨性(可选)
如果需要避免匹配到命名不符合规则的异常文件,可以先加一层格式校验:
# 生成年月参数 CURRENT_YEAR=$(date +%Y) CURRENT_MONTH=$(date +%m) LAST_YEAR=$(date -d "last month" +%Y) LAST_MONTH=$(date -d "last month" +%m) # 先校验命名格式,再排除需要保留的文件 for k in $(hdfs dfs -ls /temis_sesions_ip/bkp-cgnat/CDR_IP2MSISDN_CYO-CGN-CC-*.csv.gz \ | grep -E 'CDR_IP2MSISDN_CYO-CGN-CC-[0-9]{4}-[0-9]{2}-.+\.csv\.gz' \ | grep -vE "${CURRENT_YEAR}-${CURRENT_MONTH}|${LAST_YEAR}-${LAST_MONTH}" \ | awk '{print $8}') do hadoop fs -rm "$k" done
内容的提问来源于stack exchange,提问作者alejomarchan
相关产品推荐
相关产品推荐

