如何用jq去除Docker Engine API返回容器名的前置斜杠
这个问题我碰到过,核心原因是Docker API返回的Names字段是数组类型,而@tsv要求每行的元素都是字符串,直接把数组塞进去就会触发类型错误。另外还要处理掉名字前的斜杠,咱们一步步解决:
错误原因拆解
- Docker Engine API返回的
Names是数组(比如["/boring_feynman"]),而@tsv只能处理字符串/数值这类原子类型,数组无法直接解析,所以抛出array is not valid in a csv row错误。 - 同时需要去除
Names元素开头的前置斜杠,才能得到干净的容器名称。
修复后的完整命令
jq -r ' # 生成表头和对应长度的分隔线 (["Names","Image"] | (., map(length*"-"))), # 处理每个容器条目:提取Names并去斜杠,再匹配Image字段 (.[] | [( .Names[0] | ltrimstr("/") ), .Image]) # 转成TSV格式输出 | @tsv '
关键细节解释
- 处理
Names字段:.Names[0]:因为每个容器通常只有一个名字,直接取数组的第一个元素即可;如果你的场景存在多个容器名,可以用.Names | map(ltrimstr("/")) | join(", ")转成逗号分隔的字符串。ltrimstr("/"):精准去掉字符串开头的斜杠,不会影响名称中间可能存在的斜杠(虽然容器名一般不会有)。
- 表头与分隔线:保留了你原来的逻辑,先输出表头,再输出和表头长度匹配的分隔线,让TSV结果更易读。
@tsv兼容性:现在每个条目里的元素都是字符串类型,完全符合TSV的格式要求,不会再触发类型错误。
示例效果
假设Docker API返回的JSON片段是:
[ {"Names": ["/boring_feynman"], "Image": "nginx:alpine"}, {"Names": ["/sleepy_turing"], "Image": "ubuntu:latest"} ]
执行命令后输出的TSV:
Names Image ----- ----- boring_feynman nginx:alpine sleepy_turing ubuntu:latest
内容的提问来源于stack exchange,提问作者Hammad Butt
相关产品推荐
相关产品推荐

