从`docker-container ls -la` 的输出中只打印 `Names` 列。

5

当使用docker container ls -la命令时,输出结果如下:

CONTAINER ID   IMAGE     COMMAND               CREATED          STATUS          PORTS     NAMES
a67f0c2b1769   busybox   "tail -f /dev/null"   26 seconds ago   Up 25 seconds             recursing_liskov

我只想获取“Names”列中包含容器名称的部分。

我的想法是使用bash反转命令输出中的列,以便将“Names”列放在第一位置,并截取容器名称。

这是我尝试过的方法:

sudo docker container ls -la | rev |tail -n +2 | tr -s ' ' |  cut -d ' ' -f 1

但是这并没有得到预期的结果,而是出现了以下错误:

rev: stdin: Invalid or incomplete multibyte or wide character

我被卡住了,因为我不知道如何处理这个错误。能否修复它以获得我期望的结果?或者还有其他方法可以获得我的结果吗?


如果你想获取特定的列,只需使用 awk 抓取即可。例如 cmd | awk '{print $NF}' 以打印最后一列。不过,你的 awk 可能并不能比 rev 更好地处理多字节字符。 - William Pursell
2
你可以考虑使用更丰富的编程语言(我个人偏爱Python)和本地Docker SDK,而不是尝试抓取docker ps输出。 - David Maze
2个回答

15
不要玩弄默认输出,从一开始就打印出您想要的内容。大多数Docker子命令都接受--format选项,该选项将使用go模板表达式来指定您需要的内容。 在您的情况下,我相信以下命令应该会给出您想要的内容:
$ docker container ls -la --format "{{.Names}}"
recursing_liskov

如果您需要的话,当然可以按照最适合您需求的顺序添加更多的列。您可以使用以下命令轻松获取所有可用键的列表:

$ docker container ls -la --format "{{json .}}" | jq
{
  "Command": "\"tail -f /dev/null\"",
  "CreatedAt": "2022-01-15 23:43:54 +0100 CET",
  "ID": "a67f0c2b1769",
  "Image": "busybox",
  "Labels": "",
  "LocalVolumes": "0",
  "Mounts": "",
  "Names": "recursing_liskov",
  "Networks": "bridge",
  "Ports": "",
  "RunningFor": "20 minutes ago",
  "Size": "0B (virtual 1.24MB)",
  "State": "running",
  "Status": "Up 20 minutes"
}

这里有一个例子,只是为了说明如何使用一些字段:

$ docker container ls -la --format "container {{.Names}} is in state {{.State}} and has ID {{.ID}}"
container recursing_liskov is in state running and has ID a67f0c2b1769

我使用了几个随机引用:


1

我不确定我是否理解了你的问题,但如果你只是想重新排列列的顺序,你可以使用 awk 和它的 printf 函数。这并不是最优雅的方式,但根据你的用例,它可能适合你。

例如,你可以使用以下命令获得两列输出:

cmd | awk '{printf ("%s\t%s\n", $1, $2)}'

以同样的方式,你可以这样做:
docker container ls -la | awk '{printf ("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n", $8, $1, $2, $3, $4, $5, $6, $7)}'

正如我所说,这可以被视为一种不太正规的解决方案,但我不确定您的使用情况需要什么。请注意,默认情况下,带有列名的第一行可能不会像它看起来那么漂亮。您可以通过给每个元素设置(最大)宽度(%5s设置宽度为5)来解决这个问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接