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

如何按参考编号过滤日志?Python/Bash/Grep/Awk实现方案

提取指定参考编号的日志段实现方案

先假设日志示例格式如下:

[REF:0000] 系统启动
初始化配置文件
[REF:1111] 用户登录请求
用户名:test
IP:192.168.1.100
登录状态:成功
[REF:2222] 数据查询操作
查询表:user_info
查询条件:id=123
返回结果:2条
[REF:3333] 系统退出

以下是不同工具的实现方法:

Awk实现(推荐)

Awk是处理日志分段的高效工具,通过模式匹配控制输出逻辑:

# 提取REF:1111对应的日志段
awk '/\[REF:1111\]/{flag=1; print; next} /\[REF:/{flag=0} flag' log.txt

# 提取REF:2222对应的日志段
awk '/\[REF:2222\]/{flag=1; print; next} /\[REF:/{flag=0} flag' log.txt

说明:

  • /\[REF:1111\]/匹配目标参考编号行,设置输出标志flag=1并打印该行,next跳过后续逻辑
  • 遇到其他[REF:开头的行时,设置flag=0停止输出
  • flag为真时,自动打印当前行

如果要一次性提取1111和2222两个段:

awk '/\[REF:(1111|2222)\]/{flag=1; print; next} /\[REF:/{flag=0} flag' log.txt

Bash脚本实现

纯Bash循环读取每行,通过状态变量控制输出:

#!/bin/bash
target_refs=("1111" "2222")
current_flag=0

while IFS= read -r line; do
    # 匹配参考编号行
    if [[ "$line" =~ \[REF:([0-9]+)\] ]]; then
        ref_num="${BASH_REMATCH[1]}"
        # 判断是否为目标编号
        if [[ " ${target_refs[@]} " =~ " $ref_num " ]]; then
            current_flag=1
            echo "$line"
        else
            current_flag=0
        fi
    elif [[ $current_flag -eq 1 ]]; then
        echo "$line"
    fi
done < log.txt

说明:

  • target_refs数组存储需要提取的参考编号
  • 用正则解析每行的参考编号,匹配到目标编号时开启输出标志,遇到其他编号时关闭
  • 输出标志开启时打印普通文本行

Python脚本实现

适合需要复杂逻辑扩展的场景:

target_refs = {'1111', '2222'}
output_flag = False

with open('log.txt', 'r') as f:
    for line in f:
        line = line.rstrip('\n')
        # 检查是否包含参考编号
        if '[REF:' in line:
            ref_start = line.find('[REF:') + 5
            ref_end = line.find(']', ref_start)
            if ref_start != -1 and ref_end != -1:
                ref_num = line[ref_start:ref_end]
                if ref_num in target_refs:
                    output_flag = True
                    print(line)
                else:
                    output_flag = False
        elif output_flag:
            print(line)

说明:

  • 用集合存储目标编号,提升匹配效率
  • 逐行读取日志,解析参考编号后判断是否开启输出
  • 输出标志开启时打印普通文本行

Grep结合Sed实现

通过Grep定位目标行号,再用Sed提取后续内容:

# 提取REF:1111的日志段
grep -n "\[REF:1111\]" log.txt | cut -d: -f1 | xargs -I {} sed -n "{} , /\[REF:/p" log.txt | sed '$d'

# 提取REF:2222的日志段
grep -n "\[REF:2222\]" log.txt | cut -d: -f1 | xargs -I {} sed -n "{} , /\[REF:/p" log.txt | sed '$d'

说明:

  • grep -n获取目标行的行号
  • sed -n "起始行, /模式/p"提取从起始行到下一个参考编号行的内容
  • sed '$d'删除最后一行(即下一个参考编号行)

内容的提问来源于stack exchange,提问作者Ferrum3000

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 07:35:10