如何压缩 bash 命令输出中的空格?

如何压缩 bash 命令输出中的空格?

我在小屏幕上工作,并试图缩短该命令的输出,但我无法使其工作。

命令:docker container ls --all

输出(太宽!):

CONTAINER ID        IMAGE                                                             COMMAND             CREATED             STATUS                        PORTS               NAMES
e56e7efd4c3c        137112412989.dkr.ecr.us-west-2.amazonaws.com/amazonlinux:latest   "/bin/bash"         32 minutes ago      Exited (127) 31 minutes ago                       ami-test

我想要的输出:

CONTAINER ID | IMAGE | COMMAND | CREATED | STATUS | PORTS | NAMES
e56e7efd4c3c | 137112412989.dkr.ecr.us-west-2.amazonaws.com/amazonlinux:latest | "/bin/bash" | 32 minutes ago | Exited (127) 31 minutes ago | ami-test

以下是我尝试过的大约 20 种变体,但均未奏效:

docker container ls --all  | sed "s/\s+/|/g"

docker container ls --all 2>&1 | sed -e 's/\s+//g'

docker container ls --all 2&1> | sed -e 's/[[:space:]]*/ /'

docker container list --all | sed -e "s/\t/ /g"

我怀疑我对管道和/或 sed 的理解存在根本错误。

答案1

也许你也可以尝试使用 --format 选项。以下是关联到docker参考。

我尝试使用格式选项重新创建您想要的输出。

root@ubuntu:~# docker container ls --all --format "table {{.ID}} | {{.Image}} | {{.Command}} | {{.CreatedAt}} | {{.Status}} | {{.Ports}} | {{.Names}}"
CONTAINER ID | IMAGE | COMMAND | CREATED AT | STATUS | PORTS | NAMES
5b19f1d7efc1 | ubuntu | "bash" | 2018-10-14 08:11:03 +0000 UTC | Exited (0) 17 minutes ago |  | jovial_spence
05250b252a98 | hello-world | "/hello" | 2018-10-14 08:10:10 +0000 UTC | Exited (0) 18 minutes ago |  | practical_bohr
b206b0ad1f42 | hello-world | "/hello" | 2018-09-27 14:51:49 +0000 UTC | Exited (0) 2 weeks ago |  | nifty_gates
root@ubuntu:~#

答案2

误解是 sed 默认使用基本正则表达式https://www.gnu.org/software/gnulib/manual/html_node/ed-regular-expression-syntax.html) — “一个或多个”量词需要反斜杠\+

使用扩展正则表达式https://www.gnu.org/software/gnulib/manual/html_node/egrep-regular-expression-syntax.html) 做这个:

docker container ls --all  | sed -E 's/\s+/ | /g'

请注意,GNU sed 接受\s。并非所有 sed 都接受。

答案3

通过使用以下工具编辑输出,您可以做的最好的事情sed是:

docker container ls --all | sed 's/[[:space:]][[:space:]][[:space:]]*/ | /g'

这将在任何(符合 POSIX 标准的) sed 版本中工作(无需担心 GNU 支持或是否转义字符+将需要 2 个以上的空格字符,这样你就不会得到额外的分隔符,例如32 | minutes | ago

实际上,s/ */ | /g(三个文字空格然后是一个星号)就足够了,因为我怀疑您是否获得了制表符或更多奇特的空格字符。

请注意,“理想”答案应该具有正确对应的空白字段(在示例输出中,PORTS 为空)。问题所需的输出缺少 PORTS 的空白条目,这很好,因为否则将无法解析(不更改命令docker或假设最多一个空白条目或对输出可能性有其他深入了解)。

所以,kottapar 的回答,它给出了更合适的docker命令,是更可取的。

相关内容