В общем случае избегайте анализа выходных данных, предназначенных для потребления человеком.Многие современные утилиты предлагают возможность производить вывод в некотором стандартном формате, таком как JSON или XML, или даже CSV (хотя это менее строго определено и существует в нескольких «диалектах»).
docker
, в частности, имеетобобщенная опция --format
, которая позволяет указать собственный формат вывода:
docker images --format "{{.ID}}"
Если вы не можете избежать написания своего собственного анализатора (действительно ли вы уверены !? Посмотрите еще раз!), cut
подходит для вывода с определенным одиночным символьным разделителем или иным образом достаточно регулярным выводом.Для всего остального я бы пошел с Awk.Из коробки он анализирует столбцы из последовательностей пробелов , поэтому он выполняет именно то, что вы конкретно просите:
docker images | awk 'NR>1 { print $3 }'
(NR>1
пропускает первую строку, содержащуюзаголовки столбцов.)
В случае столбцов фиксированной ширины он позволяет вытащить строку по индексу:
docker images | awk 'NR>1 { print substr($0, 41, 12) }'
... хотя вы можете сделать это с помощью cut
тоже:
docker images | cut -c41-53
... но обратите внимание, что Docker может регулировать ширину столбцов в зависимости от размера вашего экрана!
Awk позволяет вам также писать извлечения из регулярных выражений:
awk 'NR>1 { sub(/^([^[:space:]]*[[:space:]]+){2}/, ""); sub(/[[:space]].*/, ""); print }'
Здесь он перекрывается с sed
:
sed -n '2,$s/^[^ ]\+[ ]\+[^ ]\+[ ]\+\([^ ]\+\)[ ].*/\1/p'
, хотя sed
значительно менее удобочитаем, особенно для нетривиальных сценариев.(Это все еще довольно тривиально.)
Если вы раньше не использовали регулярные выражения, приведенное выше будет казаться загадочным, но на самом деле его не так уж сложно выделить.Мы ищем последовательности непробелов (поле в столбце), за которыми следуют последовательности пробелов (разделитель столбцов) - две перед полем идентификатора и все, что идет после него, начиная с первого пробела после столбца идентификатора.
Если вы хотите изучить сценарии оболочки, вам, вероятно, следует также изучить хотя бы основы Awk (и мимолетное знакомство с sed
).Если вы просто хотите выполнить свою работу и, возможно, не особенно заинтересованы в изучении инструментов U * x (хотя, вероятно, вам все равно это нужно!), Возможно, вместо этого изучите современный язык сценариев, такой как Python или Ruby.
... Вот библиотека Python docker
:
import docker
client = docker.from_env()
for image in client.images.list():
print(image.id)