如何用Shell将批量IP的Whois查询结果按单IP单行存入CSV
问题原因
whois查询结果经过rs -T转置后本身会输出多行内容,原有脚本没有处理中间换行符,所以单个IP的查询结果会被拆分为多行写入CSV文件。
可行解决方案
基础修正版脚本(串行执行,适合小批量IP)
# 先写入自定义表头,可根据实际需要调整字段内容 echo "ip,inetnum,netname,country,status,descr,admin_c,tech_c,abuse_mailbox,last_modified,source" > output.csv while read -r ip; do # 处理单IP whois结果:先替换所有换行符为空格避免拆行,再做格式转换,最后统一补换行 whois "$ip" | grep ':' | tr -d ':' | tr '\n' ' ' | rs -T | tr -s ' ' ',' | tr -d '\n' echo "" done < "ip.txt" >> output.csv
核心修改点
- 提前写入CSV表头,无需后续手动添加
- 处理单IP结果时先把所有换行替换为空格,保证转置后的内容连续
- 单IP所有内容处理完成后再统一添加换行符,确保每个IP的结果只占一行
- 给变量
$ip添加引号,符合Shell脚本编写规范,避免异常字符报错
优化版脚本(并行执行,适合9000个IP的批量场景)
串行执行9000次whois查询耗时过长,可通过xargs开启并行查询提升效率,以下示例同时运行10个查询进程:
# 先写入自定义表头 echo "ip,inetnum,netname,country,status,descr,admin_c,tech_c,abuse_mailbox,last_modified,source" > output.csv # 并行查询,-P参数后面的数字是同时运行的进程数,可根据自身网络情况调整 cat ip.txt | xargs -P 10 -I {} sh -c 'whois "{}" | grep ":" | tr -d ":" | tr "\n" " " | rs -T | tr -s " " "," | tr -d "\n"; echo ""' >> output.csv
注意事项
- 若遇到whois查询频率限制被封IP,可在循环中添加
sleep 1命令增加查询间隔 - 不同注册局返回的whois字段顺序可能不同,若需要固定列顺序,建议用awk单独提取每个指定字段,而非直接转置全部结果,可避免CSV列错位问题
- 若字段内容本身包含逗号,建议给每个字段外层包裹双引号,避免CSV解析异常
内容的提问来源于stack exchange,提问作者Domica
相关产品推荐
相关产品推荐

