如何用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
相关产品推荐
相关产品推荐

