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

如何用awk/sed/Python提取非指定Hosts IP对应的Query文本段?

这儿有几个实用的方案,分别用awk、sed和Python实现,正好满足你提取特定Query块的需求:

使用awk实现

awk处理这类文本块分割简直是天生好手,我们可以把每个# Query开头的块当作独立记录,再检查块内的Hosts行是否不符合目标IP模式:

BEGIN {
    RS = "# Query"  # 用# Query作为记录分隔符
    ORS = ""         # 不自动加换行,保留原文件格式
}
NR > 1 {  # 跳过文件开头到第一个Query之间的空内容
    # 检查当前块里有没有带目标IP的Hosts行,没有就输出
    if ($0 !~ /# Hosts ip-127-0-0-1/) {
        print "# Query" $0  # 把分隔符补回来,输出完整Query块
    }
}

使用方法:把代码存成filter_queries.awk,然后执行:

awk -f filter_queries.awk your_input_file.txt

逻辑说明

  • 用RS把每个Query拆成单独的记录;
  • 跳过第一个空记录(文件开头没内容);
  • 只要块里不包含# Hosts ip-127-0-0-1(不管后面跟着什么文本),就输出整个块。

使用sed实现

sed处理多行文本需要用到分支标记,这个脚本就能搞定:

/# Query/{
    :loop
    N
    /# Query/!b loop
    /# Hosts ip-127-0-0-1/d
}

使用方法:

sed -n -f filter_queries.sed your_input_file.txt

逻辑说明

  • 匹配到# Query时,开始收集后续行(N命令),直到遇到下一个# Query;
  • 如果收集到的块里有目标IP的Hosts行,直接删掉这个块;
  • 没匹配到目标IP的块会被保留输出。

使用Python实现

如果更熟悉Python,这个脚本会更直观,后续要扩展功能也方便:

def filter_queries(input_file, output_file, exclude_ip_prefix="ip-127-0-0-1"):
    with open(input_file, 'r') as f:
        content = f.read()
    
    # 按# Query分割所有块,第一个元素是空字符串(文件开头到第一个Query的内容)
    query_blocks = content.split("# Query")
    
    with open(output_file, 'w') as f:
        for block in query_blocks[1:]:  # 跳过空的第一个块
            # 检查块里有没有带排除IP前缀的Hosts行
            if f"# Hosts {exclude_ip_prefix}" not in block:
                f.write(f"# Query{block}\n")

# 调用示例,替换成你的文件名
filter_queries("your_input_file.txt", "filtered_queries.txt")

逻辑说明

  • 读取整个文件内容,按# Query分割成多个块;
  • 遍历每个Query块,检查是否包含目标IP的Hosts行;
  • 把符合条件的块写入输出文件,同时补回# Query前缀。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:04:14