awk에서 docker ps의 ID/NAMES 추출

10072 단어 DockerBashawktech
docker로 각종 조작을 하고 싶을 때 docker ps 컨테이너 상태를 확인합니다.
결과에서 작업할 컨테이너 ID 및 컨테이너 이름
마우스 복사로 docker의 정지·삭제를 진행하는 사람이 의외로 있지 않습니까?
docker ps의 출력에서 awk를 조합하면 마우스 복사를 하지 않아도 용기 조작을 할 수 있습니다.
ID/NAMES 열을 뽑는 방법은 방법이 아니지만 이 글에서 제가 할 수 있는 대로 가장 쉬운 방법을 설명하겠습니다.
이 글에서 가장 중요한 점은 "awk '$0=$1' 편리하다!"네.
그렇긴 하지만 특별한 awk에 대해 자세히 알지 않으면 한꺼번에 너무 많이 비약하기 때문에 순서를 따라본다.
이미 여러 가지 방법을 생각해 낸 사람은 참고하세요.

docker ps 샘플


예를 들어 본 글에서 사용한 컨테이너 상태를 설명하다(나의 실제 환경을 바탕으로 약간 가공했다)
$ docker ps -a
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS                      PORTS                            NAMES
DG0da5099539        bashcms2:test         "apachectl -D FOREGR…"   2 weeks ago         Exited (255) 11 days ago    8070/tcp, 0.0.0.0:8070->80/tcp   bashcms2
DGd65fa33a85        c391afa02765          "/bin/sh -c 'target=…"   2 weeks ago         Exited (127) 2 weeks ago                                     busy_beaver
DG1de459c644        ubuntu                "/bin/bash"              2 months ago        Exited (130) 2 months ago                                    hungry_bhaskara
DG99f3eb9712        growi_elasticsearch   "/usr/local/bin/dock…"   6 months ago        Up 11 days                  9200/tcp, 9300/tcp               growi_elasticsearch_1
이 출력에서awk를 통해 특정 용기의 ID와 용기 이름을 가져옵니다.

awk


텍스트를 입력하는 것 외에 패턴과 동작을 지정하는 것이 awk의 기본 사용법입니다.
입력한 텍스트에서 특정 모드에 맞는 줄을 특정한 동작으로 가공할 수 있습니다.awk 'パターン{アクション}' 入力データhttps://www.gnu.org/software/gawk/manual/gawk.html#Getting-Started
정식으로 awk를 사용할 때 모드의 조건식과 정규 표현식은 동작의 제어문과 삽입식 함수를 조합하면 매우 대단하지만 이 글은 일부분에 한정된다.
다음은 텍스트 입력 (uname 출력) 에서 특정 열을 awk로 표시하는 예입니다.
$ uname -a
Linux raspberrypi 4.19.66-v7+ #1253 SMP Thu Aug 15 11:49:46 BST 2019 armv7l GNU/Linux

$ uname -a | awk '{print $2}'  # 2列目を表示
raspberrypi

$ uname -a | awk '{print $NF}'  # 最終列を表示 (NF = Number of Fields、要素数)
GNU/Linux

$ uname -a | awk '{print $0}'  # 全列を表示
Linux raspberrypi 4.19.66-v7+ #1253 SMP Thu Aug 15 11:49:46 BST 2019 armv7l GNU/Linux
awk에서 입력한 텍스트는 공백 시퀀스 (한 개 이상의 공백, 탭, 줄 바꾸기) 로 구분된 요소로 처리할 수 있습니다.$2를 쓰면 공백 칸막이의 두 번째, $0를 쓰면 문자의 단락에 상관없이 전체 줄을 지정할 수 있다.
https://www.gnu.org/software/gawk/manual/gawk.html#Default-Field-Splitting
https://www.gnu.org/software/gawk/manual/gawk.html#index-sidebar-6

컨테이너 ID 일람, 컨테이너 이름 일람 가져오기


여기까지의 내용에 따라 docker ps 결과에서 용기 ID·용기 이름을 추출할 수 있다.
# コンテナID一覧を取得(1列目)
$ docker ps -a | awk '{print $1}'
CONTAINER
DG0da5099539
DGd65fa33a85
DG1de459c644
DG99f3eb9712

# コンテナ名取得(最終列)
$ docker ps -a | awk '{print $NF}'
NAMES
bashcms2
busy_beaver
hungry_bhaskara
growi_elasticsearch_1

# ubuntuイメージのコンテナIDだけ取得
$ docker ps -a | grep ubuntu | awk '{print $1}'
DG1de459c644
일람표를 가져올 때 탭 줄(CONTAINER, NAMES)이 표시되지만 특정 용기를 지정할 때 용기의 원시 이미지 이름이나 용기 이름으로grep이 진행되기 때문에 탭 줄을 삭제할 수 있습니다.
컨테이너 ID를 취득할 수 있다면 다음과 같은 정지, 삭제 등을 할 수 있다.
# コンテナを停止
$ docker stop $(docker ps -a | grep <対象コンテナの名前・ID> | awk '{print $1}') 

# コンテナを削除
$ docker rm $(docker ps -a | grep <対象コンテナの名前・ID> | awk '{print $1}') 

# コンテナの中に入る
$ docker exec -it $(docker ps -a | grep <対象コンテナの名前・ID> | awk '{print $1}') /bin/bash

표시를 좀 더 짧게 해라


당초의 목적은 이미 실현되었지만,awk의 기술은 좀 더 짧을 수 있다.
이곳의 목적은 중괄호를 쓰지 않고 특정 열을 표시하는 것이다.

동작을 생략하다


# (再掲)awkの普通のアクション表記
$ uname -a | awk '{print $0}' 
Linux raspberrypi 4.19.66-v7+ #1253 SMP Thu Aug 15 11:49:46 BST 2019 armv7l GNU/Linux

# パターンに1を指定し、アクションを省略する = print $0と同等
$ uname -a | awk '1'  
Linux raspberrypi 4.19.66-v7+ #1253 SMP Thu Aug 15 11:49:46 BST 2019 armv7l GNU/Linux

# パターンが0の場合、アクションが実行されない
$ uname -a | awk '0' 
$ 
awk의 기본 쓰기 방법은 awk 'パターン{アクション}' 入力データ입니다. 동작을 지정하지 않을 때{print $0}는 기본적으로 적용됩니다.
https://www.gnu.org/software/gawk/manual/gawk.html#Action-Overview
그러나 패턴이 일치할 때만 이 동작을 실행합니다.
1만 쓰면 공식으로 해석되고 문자열은 빈 문자를 제외하고 숫자는 0을 제외하고는 일치하는 것으로 해석된다.
https://www.gnu.org/software/gawk/manual/gawk.html#Pattern-Overview

$0 덮어쓰기


이렇게 awk '1' 쓰면 모든 줄이 저렇게 표시된다. (cat와 같은 동작을 한다.)다음은 특정 열만 표시하는 처리입니다.
일반적으로 동작에 표시할 열을 지정하지만 대체$0 공식을 패턴에서 작성하여 동작 없이 지정된 행만 표시할 수 있습니다.
https://www.gnu.org/software/gawk/manual/gawk.html#Changing-Fields
# 1列目のみ表示
$ uname -a | awk '$0=$1'
Linux

# 最終列のみ表示
$ uname -a | awk '$0=$NF'
GNU/Linux
이렇게 하면 중괄호를 쓰지 않고 특정 열을 표시할 수 있다.
방금 용기 ID 취득·용기 이름 취득 방법을 고쳐 보세요.
# コンテナID一覧を取得(1列目)
$ docker ps -a | awk '$0=$1'
CONTAINER
DG0da5099539
DGd65fa33a85
DG1de459c644
DG99f3eb9712

# コンテナ名取得(最終列)
$ docker ps -a | awk '$0=$NF'
NAMES
bashcms2
busy_beaver
hungry_bhaskara
growi_elasticsearch_1

# ubuntuイメージのコンテナIDだけ取得
$ docker ps -a | grep ubuntu | awk '$0=$1'
DG1de459c644
평소 awk에 익숙하지 않은 사람이라도 이 길이면 쓸 수 있죠?

주의점


이 기사의 제목은 사실'awk에서 docker ps가 원하는 팀을 고르자'는 것이다.
하지만 ID/NAMES의 한정된 내용으로 바뀌었다.왜냐하면...
$ docker ps -a
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS                      PORTS                            NAMES
DG0da5099539        bashcms2:test         "apachectl -D FOREGR…"   2 weeks ago         Exited (255) 11 days ago    8070/tcp, 0.0.0.0:8070->80/tcp   bashcms2
DGd65fa33a85        c391afa02765          "/bin/sh -c 'target=…"   2 weeks ago         Exited (127) 2 weeks ago                                     busy_beaver
DG1de459c644        ubuntu                "/bin/bash"              2 months ago        Exited (130) 2 months ago                                    hungry_bhaskara
DG99f3eb9712        growi_elasticsearch   "/usr/local/bin/dock…"   6 months ago        Up 11 days                  9200/tcp, 9300/tcp               growi_elasticsearch_1

# コマンド列(3列目)を取ろうとすると途中で欠けてしまう
$ docker ps -a | awk '{print $3}'
IMAGE
"apachectl
"/bin/sh
"/bin/bash"
"/usr/local/bin/dock…"

# 期待している出力はコレ
COMMAND
"apachectl -D FOREGR…"
"/bin/sh -c 'target=…"
"/bin/bash"
"/usr/local/bin/dock…"
특별히 지정하지 않으면 awk는 공백 시퀀스 (한 개 이상의 공백, 탭 문자, 줄 바꾸기) 로 열을 구분하기 때문에 '' 를 사용해도 중간에 중단됩니다.
컨테이너 ID/컨테이너 이름을 추출할 때 동일한 일이 발생하지 않는 경우
컨테이너 ID/컨테이너 이름에는 공백 시퀀스(하나 이상의 공간, 레이블, 줄 바꿈)가 포함되지 않습니다.
https://github.com/moby/moby/blob/be97c66708c24727836a22247319ff2943d91a03/daemon/names/names.go
https://github.com/moby/moby/blob/1fd7e4c28d3a4a21c3540f03a045f96a4190b527/pkg/namesgenerator/names-generator.go
https://docs.docker.com/engine/reference/commandline/create/
컨테이너 ID 목록에 표시된 명령을 가져오는 것은 사실상 첫 번째 줄의 라벨이 올바르지 않습니다
엄밀히 말하면 콘타뉴어 ID일 거예요.
태그 행에 나타나는 공백을 바꾸면 태그가 제대로 표시됩니다.
# コンテナID一覧を取得
$ docker ps -a | awk '$0=$1'
CONTAINER
DG0da5099539
DGd65fa33a85
DG1de459c644
DG99f3eb9712

# ラベル行のみsedで前処理を行う(半角スペースをアンダーバーに置換)
$ docker ps -a | sed "1s/ /_/" | awk '$0=$1'
CONTAINER_ID
DG0da5099539
DGd65fa33a85
DG1de459c644
DG99f3eb9712

최후


작문 과정에서 "이런 처리는 docker 옵션으로 제공되지 않습니까...?"이렇게 생각하다
docker ps의 옵션을 다시 본 후 --format 옵션에 명확하게 적혀 있습니다.
https://docs.docker.com/engine/reference/commandline/ps/#options
# コマンド列(3列目)の内容を抜き取る
$ docker ps -a --format "table {{.Command}}"
COMMAND
"apachectl -D FOREGR…"
"/bin/sh -c 'target=…"
"/bin/bash"
"/usr/local/bin/dock…"

# コンテナID、コンテナ名の取得ももちろん可能
$ docker ps -a --format "table {{.ID}}"
CONTAINER ID  
DG0da5099539  
DGd65fa33a85   
DG1de459c644  
DG99f3eb9712   

$ docker ps -a --format "table {{.Names}}"
NAMES
bashcms2
busy_beaver
hungry_bhaskara
growi_elasticsearch_1
내 조사에 따르면 용기 ID/용기 이름의 일람은 dockerps의 -format 옵션을 사용하거나awk·grep로 dockerps를 가공한 결과 간단한 방법이다.
각자의 특징을 표에 정리했으니 각자 좋아하는 방법을 사용하세요!
수완
기억할 수 없는 물건
때리고 싶지 않은 거.
awk,grep
docker ps --format
awk의 기법
작은따옴표
안 들어갔어요.
awk,grep
docker ps-format의 기법
중괄호
들어가다

좋은 웹페이지 즐겨찾기