使用AWK或其他工具实现备份策略状态记录的精准筛选需求
使用AWK或其他工具实现备份策略状态记录的精准筛选需求
我来帮你搞定这个筛选需求!这个逻辑说起来就是:只要某个备份策略出现过失败记录,就只保留它的失败行;如果全是成功,就保留所有成功行。用AWK就能完美实现,而且效率很高,咱们直接上方案:
核心AWK解决方案
这个方法分两次遍历输入文件:第一次先标记出所有存在失败记录的策略,第二次根据标记结果筛选输出对应的行。
你可以把这段代码存成脚本文件(比如filter_backups.awk):
# 第一次遍历文件,记录有失败记录的策略 NR == FNR { if ($3 == "fail") { has_fail[$2] = 1 # 用数组标记该策略存在失败 } next # 跳过后续逻辑,处理下一行 } # 第二次遍历文件,根据标记筛选输出 { if (has_fail[$2]) { # 如果策略有过失败,只输出它的失败行 if ($3 == "fail") print $0 } else { # 如果策略全是成功,输出所有成功行 if ($3 == "successful") print $0 } }
然后运行命令:
awk -f filter_backups.awk input_file.txt input_file.txt
或者嫌麻烦的话,直接用一行命令搞定:
awk 'NR==FNR{if($3=="fail")has_fail[$2]=1;next} has_fail[$2] ? $3=="fail" : $3=="successful"' input_file.txt input_file.txt
这段命令会自动忽略表头,因为表头的第三列是state,既不是fail也不是successful,所以不会被输出,正好符合你的要求。
用Shell工具组合实现(备选方案)
如果你更习惯用基础Shell工具,也可以分两步走:
- 先提取所有存在失败记录的策略名:
grep "fail" input_file.txt | awk '{print $2}' | sort -u > failed_policies.txt
- 分别筛选输出失败策略的失败行,以及非失败策略的成功行:
# 输出失败策略的所有失败行 grep -Ff failed_policies.txt input_file.txt | grep "fail" # 输出无失败策略的所有成功行 grep -vFf failed_policies.txt input_file.txt | grep "successful"
不过这个方法需要生成临时文件,不如AWK方案简洁高效,更推荐用AWK的方法。
备注:内容来源于stack exchange,提问作者Sandeep_Patil
相关产品推荐
相关产品推荐

