如何用Shell脚本将YAML数据从列转成行并保存为TXT
解决方案
原始输入数据
- id: 200 addr: 10.242.57.129/27 - id: 210 addr: 10.242.57.161/25 - id: 300 addr: 10.244.26.1/24
目标输出格式
200,10.242.57.125,27 210,10.242.57.162,25 300,10.244.26.11,24
可行Shell命令方案
方案1:使用awk(推荐,简洁高效)
如果仅需完成格式转换(将id、IP、前缀用逗号分隔),执行以下命令:
awk ' /id:/ { id = $NF } /addr:/ { split($NF, parts, "/") print id "," parts[1] "," parts[2] }' input.txt > output.txt
说明:
- 遇到含
id:的行,提取最后一个字段作为id值; - 遇到含
addr:的行,用/拆分地址,分离出IP和子网前缀; - 按
id,IP,前缀格式输出到目标文件。
如果需要像示例中修改IP最后一位(如10.242.57.129→10.242.57.125),可调整awk命令自定义IP修改规则:
awk ' /id:/ { id = $NF } /addr:/ { split($NF, addr_parts, "/") split(addr_parts[1], ip_segs, ".") # 根据id匹配修改IP最后一段 if (id == 200) ip_segs[4] = 125 else if (id == 210) ip_segs[4] = 162 else if (id == 300) ip_segs[4] = 11 new_ip = ip_segs[1]"."ip_segs[2]"."ip_segs[3]"."ip_segs[4] print id "," new_ip "," addr_parts[2] }' input.txt > output.txt
方案2:使用grep+sed+paste
分步骤提取并合并数据:
# 提取所有id值到临时文件 grep 'id:' input.txt | sed 's/.*id: //' > temp_ids.txt # 处理addr,将/替换为逗号,输出到临时文件 grep 'addr:' input.txt | sed 's/.*addr: //; s/\//,/' > temp_addrs.txt # 合并两个临时文件,用逗号分隔字段 paste -d ',' temp_ids.txt temp_addrs.txt > output.txt # 清理临时文件 rm temp_ids.txt temp_addrs.txt
原命令失效原因
你之前的命令存在以下问题:
grep未指定输入文件,管道顺序错误;cut不支持-e参数,语法无效;- 整体逻辑无法正确关联成对的id和addr行。
内容的提问来源于stack exchange,提问作者Majid Rismankar
相关产品推荐
相关产品推荐

