手把手教你用脚本批量删除代理规则(附详细代码)
📖 目录导读
为什么需要批量删除代理规则?
在日常使用代理工具(如Clash、Shadowsocks、V2Ray或Surge)时,规则配置文件(通常是YAML或JSON格式)会随着时间积累大量无用规则的条目。

- 过期了代理节点的线路规则
- 测试用的临时规则
- 域名或IP变更后残留的原规则
- 重复或冲突规则
当规则数量超过500条甚至上千条时,手动逐条删除不仅耗时,而且极易漏删或误删重要条目。脚本批量删除是解决这一痛点的核心方法,它能够:
- 🚀 提升效率:几秒钟完成原来需要数小时的操作
- ✅ 降低错误:通过模式匹配精准删除,避免人工遗漏
- 🔁 可重复使用:脚本可保存,下次更新规则时直接复用
- 💰 节省服务器资源:精简后的规则减少解析时间与内存占用
核心思路:脚本化操作的底层逻辑
无论使用哪种代理工具,其代理规则的存储方式一般可分为两类:
| 存储类型 | 典型格式 | 示例工具 |
|---|---|---|
| 本地文件 | YAML/JSON/TXT | Clash、Surge、Quantumult X |
| 远程API | RESTful API响应 | 部分商业代理管理面板 |
脚本批量删除的通用逻辑是:
- 读取:将规则文件加载到内存
- 筛选:根据关键词、正则表达式或索引定位要删除的条目
- 操作:删除匹配项(注意备份原始文件)
- 写入:将修改后的内容覆盖原文件或保存为新文件
伪代码示例:
for 每条规则 in 规则列表:
if 规则包含("旧代理名") or 规则匹配(正则):
删除该规则
保存新规则列表
准备工作:环境与工具清单
在执行脚本前,请确认以下条件:
- ✅ 操作系统:Windows/Linux/MacOS均可,需支持Python 3.6+或bash
- ✅ 代理工具配置文件:找到对应工具的规则文件路径(例如Clash的
config.yaml) - ✅ 备份原文件:使用
cp config.yaml config.yaml.bak创建备份 - ✅ 依赖库安装:若使用Python解析YAML,需安装
PyYAML:pip install pyyaml - ✅ 权限:确保脚本有读写配置文件的权限
实战教学:三种主流脚本方案
方案A:基于List的快速清理(Python)
适用场景:规则文件是纯文本行列表(每行一条规则),例如Surge的规则列表。
#!/usr/bin/env python3
# 文件名:batch_delete_rules.py
import re
def delete_rules_by_keyword(filepath, keywords, output_path=None):
"""
根据关键词列表删除规则行
:param filepath: 原规则文件路径
:param keywords: 要删除的关键词列表
:param output_path: 输出路径,默认为覆盖原文件
"""
with open(filepath, 'r', encoding='utf-8') as f:
lines = f.readlines()
# 备份
backup_path = filepath + '.bak'
with open(backup_path, 'w', encoding='utf-8') as bf:
bf.writelines(lines)
# 删除包含关键词的行(忽略大小写)
new_lines = [line for line in lines
if not any(kw.lower() in line.lower() for kw in keywords)]
# 写回
target = output_path or filepath
with open(target, 'w', encoding='utf-8') as f:
f.writelines(new_lines)
print(f"删除完成!原文件备份至:{backup_path}")
print(f"共删除 {len(lines) - len(new_lines)} 条规则,剩余 {len(new_lines)} 条")
if __name__ == '__main__':
# 示例:删除包含"vpn-x"或"test-"的规则
delete_rules_by_keyword(
filepath='/etc/clash/proxy_providers/test.yaml',
keywords=['vpn-x', 'test-', '废弃节点']
)
执行命令:
python3 batch_delete_rules.py
方案B:正则匹配+自动化删除(Shell)
适用场景:Linux环境下,规则文件结构简单(如每行一个DOMAIN-SUFFIX规则)。
#!/bin/bash # 文件名:delete_rules.sh BACKUP_DIR="./backup_$(date +%Y%m%d_%H%M%S)" mkdir -p "$BACKUP_DIR" RULES_FILE="/path/to/your/rules.txt" # 备份 cp "$RULES_FILE" "$BACKUP_DIR/rules.txt.bak" # 使用sed删除匹配正则的行 # 删除所有以"DOMAIN-KEYWORD"开头的行 sed -i '/^DOMAIN-KEYWORD,/d' "$RULES_FILE" # 删除所有包含"ad-service"的行 sed -i '/ad-service/d' "$RULES_FILE" # 删除特定IP段的规则(删除例) sed -i '/^IP-CIDR,192\.168\./d' "$RULES_FILE" echo "规则清理完成,备份在 $BACKUP_DIR"
更灵活的循环删除:
#!/bin/bash
keywords=("old_node" "deprecated" "test_proxy")
for kw in "${keywords[@]}"; do
sed -i "/$kw/d" "$RULES_FILE"
done
方案C:API驱动的全量清理(适用于Clash/Surge)
适用场景:代理工具提供API接口(如Clash的RESTful API)。
#!/usr/bin/env python3
# 文件名:api_clean_rules.py
import requests
import json
CLASH_API = "http://127.0.0.1:9090" # 默认Clash API地址
SECRET = "your_clash_secret" # 如果设置了密码
def delete_proxy_group_provider(group_name, provider_name):
"""删除指定代理组的提供者"""
headers = {"Authorization": f"Bearer {SECRET}"} if SECRET else {}
url = f"{CLASH_API}/proxies/{group_name}/providers/{provider_name}"
resp = requests.delete(url, headers=headers)
if resp.status_code == 204:
print(f"成功删除provider: {provider_name}")
elif resp.status_code == 502:
print("API服务不可达,请检查Clash是否运行")
else:
print(f"删除失败:{resp.status_code} {resp.text}")
# 示例:批量删除不再使用的provider
providers_to_delete = ["old_provider_v1", "test_provider_2023"]
for provider in providers_to_delete:
delete_proxy_group_provider("Proxy", provider)
注意:使用API删除前,务必确认Clash开启了
external-controller配置。
常见问题与解决方案(FAQ)
Q1:脚本运行后规则文件变空白了!怎么办? A:立即从备份文件夹恢复,所有脚本方案都建议自动创建备份(如方案A的.bak文件),若未备份,可尝试使用版本控制工具(Git)回滚。
Q2:我的规则文件是YAML格式,如何精确删除某个键值对? A:使用Python的PyYAML库解析结构,而非文本行处理,示例:
import yaml
with open('config.yaml', 'r') as f:
data = yaml.safe_load(f)
# 删除特定key
if 'proxies' in data:
data['proxies'] = [p for p in data['proxies'] if p['name'] != 'old-proxy']
with open('config.yaml', 'w') as f:
yaml.dump(data, f)
Q3:能否删除匹配多个条件的规则?
A:可以,在方案A的keywords列表中添加多个关键词,或使用正则的符号。'ad-|tracker|analytics'。
Q4:脚本误删了重要规则如何恢复?
A:每个脚本都设计了自动备份机制,在备份目录中找到.bak文件,使用cp config.yaml.bak config.yaml恢复。
Q5:每天都需要定期清理规则,能否自动化? A:将脚本添加到cron任务(Linux)或任务计划程序(Windows)。
# 每天凌晨2点执行 0 2 * * * /usr/bin/python3 /scripts/batch_delete_rules.py
安全注意事项与最佳实践
| 注意事项 | 说明 |
|---|---|
| ▶️ 始终备份 | 脚本第一行应自动创建备份,避免误操作导致配置丢失 |
| ▶️ 小范围测试 | 先在只有3-5条规则的测试文件上运行脚本 |
| ▶️ 使用干运行模式 | 在脚本中加入 --dry-run 参数,仅输出将要删除的内容而不执行 |
| ▶️ 权限最小化 | 脚本运行用户仅拥有配置文件的读、写权限 |
| ▶️ 日志记录 | 每次删除操作输出到日志文件,记录删除了哪些规则 |
| ▶️ 版本控制 | 将配置文件纳入Git管理,每次修改后提交 |
最佳实践:
- 分级清理:先删除明确无用的规则(如带
test_前缀的),再删除过期的。 - 保留白名单:在脚本中硬编码保护的规则(如关键业务域名),避免误删。
- 验证结果:运行后使用
diff命令比较原文件与备份文件,确认删除内容符合预期。
掌握了这几种脚本方案,你就能像运维专家一样轻松处理千条级代理规则,无论是日常维护还是大规模迁移,都可以通过几行代码实现精准操作。脚本是工具,安全是底线——永远给配置上“备份保险”。