Linux下用grep/awk/sed基于端口号合并csv与yml文件的简便方法
嘿,你这个需求完全不用手动循环截取端口来实现,有两种非常简便的方案,不管是用Python脚本还是命令行工具都能快速搞定,我给你详细说说:
方案一:Python 脚本(结合 pandas + pyyaml)
这种方式灵活度高,还能自动处理端口范围(比如5162-5164这种格式),适合后续需要扩展逻辑的场景。
首先得安装依赖包:
pip install pandas pyyaml
然后写一段简洁的脚本:
import pandas as pd import yaml # 读取并解析 YAML 配置文件 with open('file2.yml', 'r') as yaml_file: service_port_map = yaml.safe_load(yaml_file) # 把端口映射转换成可匹配的格式,处理端口范围 port_service_list = [] for service_name, port_info in service_port_map.items(): if '-' in str(port_info): # 拆分端口范围,生成单个端口条目 start_port, end_port = map(int, str(port_info).split('-')) for port in range(start_port, end_port + 1): port_service_list.append({'port': port, 'service': service_name}) else: # 单个端口直接添加 port_service_list.append({'port': int(port_info), 'service': service_name}) # 转换为 DataFrame 方便后续合并 port_df = pd.DataFrame(port_service_list) # 读取 CSV 文件,指定列名 csv_df = pd.read_csv( 'file1.csv', header=None, names=['protocol', 'port', 'src_ip', 'dst_ip'], dtype={'port': int} ) # 基于端口列合并两个数据集,用左连接保留所有 CSV 条目 merged_result = pd.merge(csv_df, port_df, on='port', how='left') # 保存合并后的结果到新文件 merged_result.to_csv('merged_output.csv', index=False)
运行这个脚本后,你会得到一个merged_output.csv,里面会把CSV里的每条记录和YAML中匹配的服务名关联起来,没匹配到的服务列会显示NaN,一目了然。
方案二:命令行工具组合(csvkit + yq)
如果你不想写代码,用命令行工具组合也能快速完成,适合临时处理的场景。
首先安装所需工具:
# macOS 用 brew brew install csvkit yq # 或者用 pip 安装 pip install csvkit yq
然后执行以下三步命令:
- 把 YAML 文件转换成临时的端口映射 CSV:
yq -r 'to_entries | .[] | .key + "," + .value' file2.yml > temp_port_map.csv
- 拆分端口范围,生成每个端口对应的服务条目:
awk -F ',' '{ if ($2 ~ /-/) { split($2, range, "-"); for (i=range[1]; i<=range[2]; i++) { print $1 "," i; } } else { print $0; } }' temp_port_map.csv > expanded_port_map.csv
- 合并原始 CSV 和处理后的端口映射:
csvjoin -c port file1.csv expanded_port_map.csv --left --no-header-row -H protocol,port,src_ip,dst_ip,service > merged_output.csv
执行完后,同样会得到合并好的结果文件。
这两种方案都比手动循环截取高效得多,尤其是Python脚本,处理大量数据时优势更明显。
内容的提问来源于stack exchange,提问作者steve
相关产品推荐
相关产品推荐

