如何从docker container ls -la输出中仅提取Names列的内容?
问题处理与解决方案
原命令问题分析
你遇到的rev报错是因为docker默认输出中存在不可见的多字节控制字符,rev无法识别这类字符的编码导致运行失败。除此之外你的命令还有逻辑疏漏:反转切割得到第一列后,没有再次反转回原字符串,就算没有编码报错,得到的也是反转后的容器名称。
修复后的原方法命令
如果要坚持用反转切割的思路,可以先过滤掉非标准ASCII字符再处理,命令如下:
sudo docker container ls -la | tr -cd '\11\12\15\40-\176' | rev | tail -n +2 | tr -s ' ' | cut -d ' ' -f 1 | rev
更优实现方案
1. Docker原生格式化输出(最推荐)
Docker命令本身支持Go模板自定义输出格式,可以直接提取Names字段,完全避免文本切割的各类边界问题(比如COMMAND列带空格、PORTS列为空导致的列数偏移),稳定性最高:
sudo docker container ls -a --format '{{.Names}}'
2. awk切割默认输出
如果需要处理docker的默认输出格式,用awk实现更简单,不需要反转操作,也不会触发编码报错:
sudo docker container ls -la | awk 'NR>1 {print $NF}'
其中NR>1代表跳过第一行表头,$NF是awk内置变量,指代当前行的最后一个字段,正好对应Names列。
内容的提问来源于stack exchange,提问作者QuaQua
相关产品推荐
相关产品推荐

