Я работаю на маленьком экране и пытаюсь сократить вывод этой команды, но не могу заставить ее работать.
Команда: 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
. Не все седы делают.