如何从大文本文件中提取IP CIDR?尝试多种方法未成功
嘿,我完全懂你处理大文本提取CIDR时的头疼——这种格式的匹配很容易因为正则不够精准或者工具用法不对卡壳。下面给你几个经过实战验证的方案,覆盖不同平台,应该能帮你快速解决问题:
方法1:用grep(Linux/macOS终端)
grep是处理文本匹配的老牌利器,针对CIDR格式,我们可以用正则精准定位。直接在终端运行:
grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}/[0-9]{1,2}' large_file.txt > extracted_cidrs.txt
简单解释下参数:
-E启用扩展正则,让表达式更易写-o只输出匹配到的CIDR部分,而不是整行内容- 正则部分先匹配IPv4地址格式,再匹配后面的掩码位
- 最后用
>把结果直接保存到extracted_cidrs.txt文件里
如果需要严格验证IP的合法性(避免匹配到999.999.999.999这种无效地址),可以用更严谨的正则:
grep -Eo '((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)/([0-9]|[1-2][0-9]|3[0-2])' large_file.txt > extracted_cidrs.txt
这个版本会确保每个IP段在0-255之间,掩码在0-32之间,精准度拉满。
方法2:用PowerShell(Windows环境)
如果你用Windows,PowerShell也能轻松搞定这个需求。打开PowerShell窗口,运行:
Select-String -Path "large_file.txt" -Pattern '((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)/([0-9]|[1-2][0-9]|3[0-2])' | ForEach-Object { $_.Matches.Value } | Out-File "extracted_cidrs.txt"
Select-String负责在文件里查找匹配的内容- 同样用了严谨的正则来保证匹配的有效性
ForEach-Object提取出每个匹配到的CIDR字符串Out-File把结果写入目标文件
方法3:用Python脚本(跨平台,灵活扩展)
如果之后还要对提取到的CIDR做进一步处理(比如去重、验证可用性),Python脚本会是更灵活的选择。创建一个extract_cidrs.py文件,内容如下:
import re import sys def extract_cidrs(file_path): # 定义严谨的CIDR正则表达式 cidr_pattern = re.compile(r'((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)/([0-9]|[1-2][0-9]|3[0-2])') # 逐行读取大文件,避免内存占用过高 with open(file_path, 'r', encoding='utf-8') as f: for line in f: matches = cidr_pattern.findall(line) for match in matches: # 拼接完整的CIDR字符串(findall会返回分组内容,需要重新组合) full_cidr = f"{match[0]}{match[3]}/{match[4]}" print(full_cidr) if __name__ == "__main__": if len(sys.argv) != 2: print("用法: python extract_cidrs.py <输入文件路径>") sys.exit(1) input_file = sys.argv[1] # 将输出重定向到文件 with open('extracted_cidrs.txt', 'w', encoding='utf-8') as out_file: sys.stdout = out_file extract_cidrs(input_file)
然后在终端(或命令提示符)运行:
python extract_cidrs.py large_file.txt
这个脚本会逐行读取大文件,就算文件几十GB也不会炸内存,提取结果自动保存到extracted_cidrs.txt里。
内容的提问来源于stack exchange,提问作者Aria Fathi
相关产品推荐
相关产品推荐

