Я пытаюсь получить все порты, используемые контейнером Докера с этой командой:
sudo docker ps | tail -n1
29ba3137f3e2 java8/local:latest "/bin/bash" 3 hours ago Up 3 hours 0.0.0.0:8080->8080/tcp, 0.0.0.0:8443->8443/tcp, 0.0.0.0:32783->5432/tcp, 0.0.0.0:32782->10523/tcp DEMO-20151118124751
Когда я выполнил его в терминале, я добрался, я хочу.
$ sudo docker ps | tail -n1 | awk '{print $12}'
0.0.0.0:32783->5432/tcp,
Но мне нужны все отображенные порты. Это возможный сделать сценарий оболочки как это:
#!/bin/bash
paramnum=$(sudo docker ps | grep $lasttimestamp | wc -w);
text=$(sudo docker ps | tail -n1);
begin=($paramnum-4);
end=($paramnum-1);
for (( i=$end; i>=$begin; i--))
do
t="awk '{print $"$i"}'";
eval "echo $text | $t";
done
Я бродил вокруг в течение нескольких часов. Помогите или предложите, как получить вывод как ниже.
0.0.0.0:32782->10523/tcp
0.0.0.0:32783->5432/tcp,
0.0.0.0:8443->8443/tcp,
0.0.0.0:8080->8080/tcp,
Использование Perl:
sudo docker ps | \
tail -n 1 | \
perl -lae '$,="\n";foreach(@F){/tcp,?$/&&push(@x,$_)};print(@x)'
-l
: включает автоматическую заканчивающую строку обработку. Это имеет два отдельных эффекта. Во-первых, это автоматически громко жует $ / (входной разделитель записей) при использовании с-n или-p. Во-вторых, это присваивает $\\(выходной разделитель записей), чтобы иметь значение octnum так, чтобы любые операторы печати имели тот разделитель включенным назад. Если octnum опущен, $наборов \\к текущему значению $/.-a
: включает режим авторазделения при использовании с-n или-p. Неявная команда разделения к массиву @F сделана как первая вещь в неявном цикле с условием продолжения, произведенном-n или-p.-e
: может использоваться для ввода одной строки программы.$,="\n"
: устанавливает выходного разделителя полей на \n
;foreach(@F){/tcp,?$/&&push(@x,$_)}
: для каждого элемента @F
, если элемент заканчивается tcp
сопровождаемый дополнительным ,
добавляет элемент в конце @x
;print(@x)
: печать каждый элемент @x
сопровождаемый выходным разделителем полей;% cat in
29ba3137f3e2 java8/local:latest "/bin/bash" 3 hours ago Up 3 hours foo/tcp, 0.0.0.0:8443->8443/tcp, 0.0.0.0:32783->5432/tcp, 0.0.0.0:32782->10523/tcp DEMO-20151118124751
29ba3137f3e2 java8/local:latest "/bin/bash" 3 hours ago Up 3 hours 0.0.0.0:8080->8080/tcp, 0.0.0.0:8443->8443/tcp, 0.0.0.0:32783->5432/tcp, 0.0.0.0:32782->10523/tcp DEMO-20151118124751
29ba3137f3e2 java8/local:latest "/bin/bash" 3 hours ago Up 3 hours 0.0.0.0:8080->8080/tcp, 0.0.0.0:8443->8443/tcp, 0.0.0.0:32783->5432/tcp, 0.0.0.0:32782->10523/tcp DEMO-20151118124751
% tail -n 1 in | perl -lae '$,="\n";foreach(@F){/tcp,?$/&&push(@x,$_)};print(@x)'
0.0.0.0:8080->8080/tcp,
0.0.0.0:8443->8443/tcp,
0.0.0.0:32783->5432/tcp,
0.0.0.0:32782->10523/tcp
Согласно страницам справочника докера Вы могли попробовать это:
sudo docker ps --format "{{.Ports}}"
или если Вам также нужен идентификатор:
sudo docker ps --format "{{.ID}}: {{.Ports}}"
Это не упоминается в документации, но отформатировать вывод, который необходимо использовать {{}}
.
Кавычка от man docker-ps
:
--format="TEMPLATE"
Pretty-print containers using a Go template.
Valid placeholders:
.ID - Container ID
.Image - Image ID
.Command - Quoted command
.CreatedAt - Time when the container was created.
.RunningFor - Elapsed time since the container was started.
.Ports - Exposed ports.
.Status - Container status.
.Size - Container disk size.
.Labels - All labels asigned to the container.
.Label - Value of a specific label for this container. For example .Label "com.docker.swarm.cpu"
<час> В наше время, существует несколько полезных примечаний приблизительно {{}}
фигурные скобки в man docker-ps
:
--format="TEMPLATE"
Pretty-print containers using a Go template.
Valid placeholders:
.ID - Container ID
.Image - Image ID
.Command - Quoted command
.CreatedAt - Time when the container was created.
.RunningFor - Elapsed time since the container was started.
.Ports - Exposed ports.
.Status - Container status.
.Size - Container disk size.
.Labels - All labels assigned to the container.
.Label - Value of a specific label for this container.
For example {{.Label "com.docker.swarm.cpu"}}
Display containers with their commands
# docker ps --format "{{.ID}}: {{.Command}}"
a87ecb4f327c: /bin/sh -c #(nop) MA
01946d9d34d8: /bin/sh -c #(nop) MA
c1d3b0166030: /bin/sh -c yum -y up
41d50ecd2f57: /bin/sh -c #(nop) MA
Display containers with their labels in a table
# docker ps --format "table {{.ID}}\t{{.Labels}}"
CONTAINER ID LABELS
a87ecb4f327c com.docker.swarm.node=ubuntu,com.docker.swarm.storage=ssd
01946d9d34d8
c1d3b0166030 com.docker.swarm.node=debian,com.docker.swarm.cpu=6
41d50ecd2f57 com.docker.swarm.node=fedora,com.docker.swarm.cpu=3,com.docker.swarm.storage=ssd
Display containers with their node label in a table
# docker ps --format 'table {{.ID}}\t{{(.Label "com.docker.swarm.node")}}'
CONTAINER ID NODE
a87ecb4f327c ubuntu
01946d9d34d8
c1d3b0166030 debian
41d50ecd2f57 fedora
Используя awk
с разделителем полей {2,}
. Почему {2,}
? вывод ps
использует больше чем одно пространство как разделитель между столбцами. Средства, мы можем использовать это в качестве разделителя для awk
команда.
awk -F" {2,}" '{print $6}'
или для Вашего ps
команда
sudo docker ps | tail -n1 | awk -F" {2,}" '{print $6}'
или без tail
sudo docker ps | awk -F" {2,}" 'END {print $6}'
Демонстрационный вывод
% <<<'29ba3137f3e2 java8/local:latest "/bin/bash" 3 hours ago Up 3 hours 0.0.0.0:8080->8080/tcp, 0.0.0.0:8443->8443/tcp, 0.0.0.0:32783->5432/tcp, 0.0.0.0:32782->10523/tcp DEMO-20151118124751' \
awk -F" {2,}" '{print $6}'
0.0.0.0:8080->8080/tcp, 0.0.0.0:8443->8443/tcp, 0.0.0.0:32783->5432/tcp, 0.0.0.0:32782->10523/tcp
или
% <<<'29ba3137f3e2 java8/local:latest "/bin/bash" 3 hours ago Up 3 hours 0.0.0.0:8080->8080/tcp, 0.0.0.0:8443->8443/tcp, 0.0.0.0:32783->5432/tcp, 0.0.0.0:32782->10523/tcp DEMO-20151118124751' \
awk -F" {2,}" '{print $6}' |\
tr ' ' '\n'
0.0.0.0:8080->8080/tcp,
0.0.0.0:8443->8443/tcp,
0.0.0.0:32783->5432/tcp,
0.0.0.0:32782->10523/tcp