awk로 쪼갠 이름 합치기 문의드립니다.

keiser의 이미지

안녕하세요.
bash 쉘 스크립트 공부 중에 막히는 부분 검색중 도무지 해결방안이 안떠올라 도움 요청 드립니다.

docker images 하면 image list가 조회되는데, list를 awk로 각각 쪼갠 후 일부만 사용하려 합니다. 이후 docker image tag 명령어에 사용하고자 합니다.

REPOSITORY                     TAG                 IMAGE ID            CREATED             SIZE
123.123.123.123:5000/rook-ceph   v1.0.1              ec78bc08c619        5 months ago        696MB
123.123.123.123:5000/registry    latest              f32a97de94e1        7 months ago        25.8MB
registry                       latest              f32a97de94e1        7 months ago        25.8MB
quay.io/coreos/flannel         v0.11.0-amd64       ff281650a721        8 months ago        52.6MB

예) docker_script.sh 실행 후 새로운 주소 입력 받는다.
이후 다음과 같이 docker iamge tag 명령어로 image 이름을 변경합니다.

input: 456.456.456.456:5000
 
docker image tag 123.123.123:5000/rook-ceph:v1.0.1 456.456.456.456:5000/rook-ceph:v1.0.1
docker image tag 123.123.123:5000/registry:latest 456.456.456.456:5000/registry:latest
....

 docker_tag.sh 
 
#!/bin/bash
 
clear
 
docker_image=`docker images |awk -F' ' '{print $1}'|grep -v REPOSITORY`
docker_image_name=`docker images |awk -F' ' '{print $1}' | awk -F'/' '{print $NF}'|grep -v REPOSITORY`
docker_image_tag=`docker images |awk -F' ' '{print $2}'|grep -v TAG`
 
echo "input registry ip:port:"
read input
echo " "
 
for docker_full_name in ${docker_image/ / }
do    
if [ "$docker_full_name" != " " ];then  
echo docker image tag $docker_full_name 
continue
fi
done
 
for image_name in $docker_image_name
do      
echo "$image_name "
done
 
for image_tag in $docker_image_tag
do      
echo "$image_name:$image_tag "
done
 
for print in $docker_full_name $image_name $image_tag
do
echo " $docker_full_name $input/$image_name:$image_tag"
done

위와 같이 코드를 작성했는데, 각각으로 출력이되어 답답합니다. 또한 코드처럼 for문으로 해결이 힘들까요?

아래는 코드에 대한 출력상태입니다.

input registry ip:port:
456.456.456.456:5000
 
docker image tag 123.123.123.123:5000/rook-ceph
docker image tag 123.123.123.123:5000/registry
docker image tag registry
docker image tag quay.io/coreos/flannel
rook-ceph 
registry 
registry 
flannel 
flannel:v1.0.1 
flannel:latest 
flannel:latest 
flannel:v0.11.0-amd64 
 quay.io/coreos/flannel 456.456.456.456:5000/flannel:v0.11.0-amd64
 quay.io/coreos/flannel 456.456.456.456:5000/flannel:v0.11.0-amd64
 quay.io/coreos/flannel 456.456.456.456:5000/flannel:v0.11.0-amd64
김정균의 이미지

원하는 바가 맞는지 모르겠군요. awk 를 질문해서 awk 로 답변 드립니다.

#!/bin/bash
 
echo -n "input registry ip:port: "
read input
echo
 
docker images | awk -v new="${input}" '
    BEGIN { idx = 0; }
    ! /^REPOSITORY / {
        fullname[idx] = $1;
        tag[idx] = $2;
        idx += 1;
    }
    END {
        for ( i=0; i<idx; i++ ) {
            printf ( \
                "docket image tag %s:%s %s/%s:%s\n", \
                fullname[i], tag[i], new, gensub(/[^\/]+\//, "", "g", fullname[i]), tag[i] \
            );
        }
    }
'

결관는 다음과 같이 나옵니다.

[user@host z]$ sh c.sh
input registry ip:port: 1.1.1.1:50
 
docket image tag 123.123.123.123:5000/rook-ceph:v1.0.1 1.1.1.1:50/rook-ceph:v1.0.1
docket image tag 123.123.123.123:5000/registry:latest 1.1.1.1:50/registry:latest
docket image tag registry:latest 1.1.1.1:50/registry:latest
docket image tag quay.io/coreos/flannel:v0.11.0-amd64 1.1.1.1:50/flannel:v0.11.0-amd64
[user@host z]$
김정균의 이미지

혹시 출력되는 docker image tag 를 실행하고 싶은 거라면

eval "$(
docker image | awk -v new="${input}" '......'
)"
 
과 같이 eval 로 처리하면 됩니다.
김정균의 이미지

shell script 공부 중이라고 하시니.. shell 버전도 같이 올려 드립니다.

#!/bin/bash
 
echo -n "input registry ip:port: "
read input
echo
 
# 라인단위의 구분을 위하여 IFS를 "\n" 으로 변경. 기존 IFS는 원복을 위하여 OLD_IFS에 저장
OLD_IFS="${IFS}"
IFS=$'\n'
 
for line in $(docker images 2> /dev/null)
do
    # REPOSITORY 로 시작하면 skip
    grep -q "^REPOSITORY " <<< "${line}" && continue
 
    # 공백 분자 기준으로 배열에 담아야 해서 IFS 를 space 로 변경. 해당 라인에만 영향을 줌.
    IFS=" " P=( $line )
 
    printf "docker image tag %s:%s %s/%s:%s\n" \
        "${P[0]}" "${P[1]}" "${input}" "${P[0]##*/}" "${P[1]}"
done
 
# IFS 복원. 이 이후에 할일이 없으면 굳이 복원할 필요 없음 
IFS="${OLD_IFS}"

공부를 해야 할 포인트
1. IFS 가 무엇인가?
2. bash 배열 활용
3. inline 환경 변수 사용

bash를 공부하기에 좋은 문서로 https://mug896.github.io/bash-shell/ 추천 드립니다.
이 분이 쓰신 글 중에 awk/sed 문서도 있습니다. https://mug896.gitbooks.io/shell-script/content/ 참고.
필력이 굉장히 좋으신 듯..

keiser의 이미지

bash 스크립트 초보라, 너무 큰 도움이 되었습니다.
추천 주신 내용에 대해 공부하기 너무 좋은거 같습니다.

감사합니다^^

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.