如何用AWK/Sed结合Bash在日志中按索引匹配多模式?
用AWK+Bash实现多日志多关键词同索引匹配
完全可以用AWK结合Bash完成这个需求,核心是按索引分组追踪关键词命中情况,以下是具体实现方案:
核心AWK脚本
将以下代码保存为bond_check.awk:
BEGIN { # 定义需要匹配的三个目标关键词 targets["GLU 166"] = 0 targets["HIE 163"] = 0 targets["THR 26"] = 0 total = 3 } # 匹配指定标识行(替换成你实际的标识行正则) /==== Hydrogen Bond Analysis ====/ { in_section = 1 next } # 未进入目标区段时跳过 !in_section { next } # 提取当前行的索引(根据实际格式调整正则) match($0, /[0-9]+\.[0-9]+/) { curr_idx = substr($0, RSTART, RLENGTH) } # 检查当前行是否包含目标关键词,标记命中状态 { for (t in targets) { if (index($0, t) > 0) { targets[t] = 1 } } } # 索引切换时,检查当前索引是否集齐所有关键词 curr_idx != prev_idx && prev_idx != "" { validate() reset() prev_idx = curr_idx } # 文件结束时做最后一次检查 END { validate() } # 验证关键词是否全部命中,是则输出文件名和索引 function validate() { hit = 0 for (t in targets) { if (targets[t] == 1) hit++ } if (hit == total) { print FILENAME ": " prev_idx } } # 重置关键词命中状态,用于下一个索引 function reset() { for (t in targets) { targets[t] = 0 } }
Bash批量执行命令
在终端中运行以下命令,批量处理所有日志文件(假设日志后缀为.log):
awk -f bond_check.awk *.log
按需调整的关键点
- 标识行匹配:把脚本中的
/==== Hydrogen Bond Analysis ====/替换成你实际的标识行正则,确保只处理标识行之后的内容 - 索引提取:如果索引格式不是
数字.数字,调整match($0, /[0-9]+\.[0-9]+/)的正则,保证能准确抓取索引字符串 - 关键词兼容:脚本用
index($0, t)检查关键词是否存在于当前行,天然兼容关键词出现在任意列的场景
内容的提问来源于stack exchange,提问作者James Starlight
相关产品推荐
相关产品推荐

