Назад | Перейти на главную страницу

Как сжимать пробелы в выводе команды 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 есть что-то в корне неправильное.

Возможно, вы также можете попробовать использовать параметр --format. Вот ссылка на сайт к ссылке на докер.

Я попытался воссоздать желаемый результат, используя параметр формата.

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:~#

Лучшее, что вы можете сделать, редактируя вывод с помощью таких инструментов, как sed является:

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

Это будет работать в любой (POSIX-совместимой) версии sed (не нужно беспокоиться о поддержке GNU или о том, следует ли избегать + персонаж) и потребуется 2+ пробела, поэтому вы не получите лишних разделителей, таких как 32 | minutes | ago

Фактически, s/ */ | /g (три буквальных пробела, а затем звездочка) должно быть достаточно, поскольку я сомневаюсь, что вы получаете табуляции или более экзотические символы пробела.

Обратите внимание, что «идеальный» ответ должен иметь соответствующие пустые поля (в примере вывода ПОРТЫ пусто). В желаемом выводе вопроса отсутствует пустая запись для ПОРТОВ, что хорошо, потому что в противном случае было бы невозможно разобрать (без изменения docker команда или допущение не более одной пустой записи или другие подробные знания о возможностях вывода).

Следовательно, ответ Коттапара, что дает более подходящий docker команда, намного предпочтительнее.

Непонимание заключается в том, что по умолчанию 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. Не все седы делают.