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

如何用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

原命令失效原因

你之前的命令存在以下问题:

  1. grep未指定输入文件,管道顺序错误;
  2. cut不支持-e参数,语法无效;
  3. 整体逻辑无法正确关联成对的id和addr行。

内容的提问来源于stack exchange,提问作者Majid Rismankar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 03:05:40