You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

然后执行以下三步命令:

  1. 把 YAML 文件转换成临时的端口映射 CSV:
yq -r 'to_entries | .[] | .key + "," + .value' file2.yml > temp_port_map.csv
  1. 拆分端口范围,生成每个端口对应的服务条目:
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
  1. 合并原始 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:37:57