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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 20:30:32