2016-05-09 3 views
0

Мне нужно найти идентификатор некоторого контейнера грузчиком, но некоторые контейнеры имеют похожие названия:Grep/AWK, соответствует точной строке

$ docker images 

REPOSITORY  TAG     IMAGE ID    
app-node   latest    620350b79c5a   
app-node-temp latest    461c5143a985 

Если я бегу:

$ docker images | grep -w app-node-temp | awk -e '{print $3}' 

461c5143a985 

Если я бегу вместо :

$ docker images | grep -w app-node | awk -e '{print $3}' 

620350b79c5a 
461c5143a985 

Как я могу совместить точное название?

+0

Штрихов считаются символами без слов. В контексте будет работать 'grep '^ app-node [[: space:]]''. Конечно, 'grep' | 'awk' является анти-шаблоном большую часть времени:' docker images | awk '/^app-node [[: space:]]/{print $ 3}' 'будет лучше. –

ответ

2

Штрихов считаются символами без слов, так grep -w не будет работать, когда разница отмечена тиром.

В контексте, grep '^app-node[[:space:]]' будет работать. Он ищет требуемое имя, за которым следует пробел.

grep | awk является анти-шаблоном большую часть времени; было бы лучше использовать:

docker images | awk '/^app-node[[:space:]]/ { print $3 }' 

Или простое решение с awk снова использует равенство - как это было предложено Tom Fenech в его answer:

for server in app-node app-node-temp 
do 
    docker images | awk -v server="$server" '$1 == server { print $3 }' 
    … 
done 

Если работает docker images слишком дорого, вы можете запустить один раз и захватить вывод в файл, а затем отсканировать файл. Это показывает, как передать переменную оболочки в сценарий awk.

Шансов трубопровод будет работать, чтобы захватить изображение идентификационной информации контейнера:

image_id=$(docker images | awk -v server="$server" '$1 == server { print $3 }') 
5

Я бы сказал, просто использовать AWK с точным соответствием строки:

docker images | awk '$1 == "app-node" { print $3 }' 
+2

Да; проще ... –

Смежные вопросы