怎样用脚本批量删除代理规则?

wen 实用脚本 1

手把手教你用脚本批量删除代理规则(附详细代码)

📖 目录导读

  1. 为什么需要批量删除代理规则?
  2. 核心思路:脚本化操作的底层逻辑
  3. 准备工作:环境与工具清单
  4. 实战教学:三种主流脚本方案
  5. 常见问题与解决方案(FAQ)
  6. 安全注意事项与最佳实践

为什么需要批量删除代理规则?

在日常使用代理工具(如Clash、Shadowsocks、V2Ray或Surge)时,规则配置文件(通常是YAML或JSON格式)会随着时间积累大量无用规则的条目。

怎样用脚本批量删除代理规则?

  • 过期了代理节点的线路规则
  • 测试用的临时规则
  • 域名或IP变更后残留的原规则
  • 重复或冲突规则

当规则数量超过500条甚至上千条时,手动逐条删除不仅耗时,而且极易漏删或误删重要条目。脚本批量删除是解决这一痛点的核心方法,它能够:

  • 🚀 提升效率:几秒钟完成原来需要数小时的操作
  • 降低错误:通过模式匹配精准删除,避免人工遗漏
  • 🔁 可重复使用:脚本可保存,下次更新规则时直接复用
  • 💰 节省服务器资源:精简后的规则减少解析时间与内存占用

核心思路:脚本化操作的底层逻辑

无论使用哪种代理工具,其代理规则的存储方式一般可分为两类:

存储类型 典型格式 示例工具
本地文件 YAML/JSON/TXT Clash、Surge、Quantumult X
远程API RESTful API响应 部分商业代理管理面板

脚本批量删除的通用逻辑是:

  1. 读取:将规则文件加载到内存
  2. 筛选:根据关键词、正则表达式或索引定位要删除的条目
  3. 操作:删除匹配项(注意备份原始文件)
  4. 写入:将修改后的内容覆盖原文件或保存为新文件

伪代码示例

for 每条规则 in 规则列表:
    if 规则包含("旧代理名") or 规则匹配(正则):
        删除该规则
保存新规则列表

准备工作:环境与工具清单

在执行脚本前,请确认以下条件:

  • 操作系统:Windows/Linux/MacOS均可,需支持Python 3.6+或bash
  • 代理工具配置文件:找到对应工具的规则文件路径(例如Clash的config.yaml
  • 备份原文件:使用 cp config.yaml config.yaml.bak 创建备份
  • 依赖库安装:若使用Python解析YAML,需安装PyYAMLpip 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管理,每次修改后提交

最佳实践

  1. 分级清理:先删除明确无用的规则(如带test_前缀的),再删除过期的。
  2. 保留白名单:在脚本中硬编码保护的规则(如关键业务域名),避免误删。
  3. 验证结果:运行后使用diff命令比较原文件与备份文件,确认删除内容符合预期。

掌握了这几种脚本方案,你就能像运维专家一样轻松处理千条级代理规则,无论是日常维护还是大规模迁移,都可以通过几行代码实现精准操作。脚本是工具,安全是底线——永远给配置上“备份保险”。

抱歉,评论功能暂时关闭!