仅打印“docker-container ls -la”输出中的“Names”列

Qua*_*Qua 6 linux bash docker

发出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
Run Code Online (Sandbox Code Playgroud)

我只想获取列中存在的容器名称Names

我的想法是使用 bash 反转命令输出中的列,以便将该Names列置于第一个位置并剪切容器的名称。

这是我尝试过的:

sudo docker container ls -la | rev |tail -n +2 | tr -s ' ' |  cut -d ' ' -f 1
Run Code Online (Sandbox Code Playgroud)

然而,这并没有给出预期的结果,并且我收到以下错误:

rev: stdin: Invalid or incomplete multibyte or wide character
Run Code Online (Sandbox Code Playgroud)

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

Zei*_*tor 16

不要使用默认输出,只需从一开始就准确打印您要查找的内容即可。大多数 docker 子命令接受一个--format选项,该选项将采用go 模板表达式来指定您确切想要的内容。

就您而言,我相信以下命令应该给出您正在寻找的内容:

$ docker container ls -la --format "{{.Names}}"
recursing_liskov
Run Code Online (Sandbox Code Playgroud)

当然,如果您愿意,您可以按照最适合您需求的顺序添加更多列。您可以轻松获取所有可用键的列表,例如:

$ 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"
}
Run Code Online (Sandbox Code Playgroud)

下面是一个示例,仅用于说明某些字段的使用:

$ 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

Run Code Online (Sandbox Code Playgroud)

我使用的一些随机参考: