Unix下如何将CSV中IP掩码生成的网络IP、广播IP写入新文件
解决CSV文件中提取网络IP和广播IP并追加字段的问题
看起来你已经走了大半路了!先给你提个小细节修正:你那段网络IP计算代码里,ipcalc -n输出的是NETWORK=xxx格式,所以得把截取字符串的部分改成${bcaddr#NETWORK=},不然拿不到正确的网络IP哦。
接下来,要把原CSV的内容和计算出的两个新字段合并输出到新文件,这里给你两种实用的方案:
方案一:Bash逐行处理(适合小文件或需要简单逻辑的场景)
这个方法直观,逐行读取原CSV,计算后把原内容+新字段追加到输出文件:
#!/bin/bash # 先写入新CSV的表头(如果原CSV有表头的话,按需调整) echo "cidr,network_ip,broadcast_ip" > output.csv # 逐行读取原文件,跳过第一行表头(如果原文件没有表头,去掉`tail -n +2`直接用`< geoip.csv`) while IFS= read -r line; do # 计算网络IP:调用ipcalc后提取NETWORK的值 network=$(ipcalc -n "$line" | awk -F= '{print $2}') # 计算广播IP:调用ipcalc后提取BROADCAST的值 broadcast=$(ipcalc -b "$line" | awk -F= '{print $2}') # 将原行内容、网络IP、广播IP用逗号分隔写入新文件 echo "$line,$network,$broadcast" >> output.csv done < <(tail -n +2 geoip.csv)
如果你的原CSV每行不止一个字段(比如CIDR在第2列),只需要先拆分字段再处理:比如用IFS=, read -r col1 cidr col3 <<< "$line"拆分后,用$cidr去计算即可。
方案二:Awk批量处理(适合大文件,效率更高)
Awk的进程开销更小,处理大CSV文件时速度会快很多:
BEGIN { FS = "," # 原CSV的字段分隔符,默认是逗号,按需修改 OFS = "," # 输出新CSV的表头 print "cidr,network_ip,broadcast_ip" } # 跳过第一行表头(如果原文件没有表头,删掉这一行) NR > 1 { # 调用ipcalc获取网络IP cmd = "ipcalc -n " $1 " | awk -F= '{print $2}'" cmd | getline network close(cmd) # 记得关闭命令管道,避免资源泄漏 # 调用ipcalc获取广播IP cmd = "ipcalc -b " $1 " | awk -F= '{print $2}'" cmd | getline broadcast close(cmd) # 输出原所有字段 + 新计算的两个IP print $0, network, broadcast }
把上面的代码保存为process_cidr.awk,然后运行:
awk -f process_cidr.awk geoip.csv > output.csv
注意事项
- 确保你的系统已经安装了
ipcalc工具(大部分Linux发行版默认自带,没有的话可以用包管理器安装,比如apt install ipcalc或yum install ipcalc) - 如果原CSV的字段分隔符不是逗号,记得修改Awk里的
FS值(比如制表符的话改成FS="\t")
内容的提问来源于stack exchange,提问作者user3329160
相关产品推荐
相关产品推荐

