awk에서 docker ps의 ID/NAMES 추출
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 'パターン{アクション}' 入力データ
정식으로 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
를 쓰면 문자의 단락에 상관없이 전체 줄을 지정할 수 있다.컨테이너 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}
는 기본적으로 적용됩니다.그러나 패턴이 일치할 때만 이 동작을 실행합니다.
1만 쓰면 공식으로 해석되고 문자열은 빈 문자를 제외하고 숫자는 0을 제외하고는 일치하는 것으로 해석된다.
$0 덮어쓰기
이렇게
awk '1'
쓰면 모든 줄이 저렇게 표시된다. (cat와 같은 동작을 한다.)다음은 특정 열만 표시하는 처리입니다.일반적으로 동작에 표시할 열을 지정하지만 대체
$0
공식을 패턴에서 작성하여 동작 없이 지정된 행만 표시할 수 있습니다.# 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/컨테이너 이름에는 공백 시퀀스(하나 이상의 공간, 레이블, 줄 바꿈)가 포함되지 않습니다.
컨테이너 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
옵션에 명확하게 적혀 있습니다.# コマンド列(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의 기법
중괄호
들어가다
Reference
이 문제에 관하여(awk에서 docker ps의 ID/NAMES 추출), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/sickleaf/articles/99884a12b0489cf21d45텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)