"awk"는 컬럼 이름별로 값을 불규칙하게 출력합니다.

"awk"는 컬럼 이름별로 값을 불규칙하게 출력합니다.

helm history(Kubernetes 도구) 명령을 사용하여 내 빌드의 마지막 개정 번호를 가져오는 bash 스크립트를 작성 중입니다 . 이 명령의 출력은 다음과 같습니다.

helm history release

    REVISION    UPDATED                     STATUS      CHART                       DESCRIPTION     
    1           Mon Feb 27 12:46:10 2017    SUPERSEDED  chart-solution-0.1.0-beta1  Install complete
    2           Fri Mar  3 11:40:55 2017    SUPERSEDED  chart-solution-0.1.0-beta1  Upgrade complete
    3           Fri Mar  3 11:41:02 2017    DEPLOYED    chart-solution-0.1.0-beta1  Upgrade complete

예상되는 결과는 3열의 숫자(마지막 값) 만 반환하는 것입니다 REVISION. 이제 다음을 사용하여 이 작업을 수행할 수 있습니다.

helm history release | awk -v col=REVISION 'NR==1{for(i=1;i<=NF;i++){if($i==col){c=i;break}} print $c} NR>1{print $c}' | tail -n 1
3

그러나 "열"은 UPDATED불규칙하며(공백으로 구분된 항목) 위 명령은 REVISION열이 나타날 때까지만 작동합니다 UPDATED. 향후 버전에서 이 helm history명령이 열 순서를 변경하면 상황이 복잡해질 수 있습니다.

간단한 예는 STATUS다음 열을 사용하여 마지막 값을 얻으 려고 하는 경우입니다 UPDATED.

helm history release | awk -v col=STATUS 'NR==1{for(i=1;i<=NF;i++){if($i==col){c=i;break}} print $c} NR>1{print $c}' | tail -n 1
Mar

REVISION열 순서가 바뀌어도 올바른 마지막 값을 얻을 수 있는 방법이 있나요?

답변1

검색할 열 이름은 -col=표시된 대로 명령줄에 제공됩니다.

코드는 해당 열 이름을 줄의 시작 부분이나 공백부터 검색하고 다음 열의 시작 부분이나 줄의 끝 부분까지의 범위를 기록합니다.

이 정보를 사용하여 eof까지 기다렸다가 마지막 줄에서 하위 문자열을 추출합니다.

helm history release | perl -slne '$. == 1 and /(?:(?<=^)|(?<=\s))\Q$col\E(?:\s*|$)/ and ($p,$l)=($-[0],$+[0]-$-[0]); eof and print substr($_, $p, $l) =~ s/\s*$//r;' -- -col='REVISION' 
'

답변2

col='REVISION' \
   perl -lne '
       $. == 1 and /(?:^|\s)(?=$ENV{col}(?:\s|$))/g and $h=pos, next;
       /^.{$h}/g; /\G(\S+)/ and print $1;
       next;
   ' yourfile


col='REVISION' \
   perl -lne '
      $. == 1 and $h = index($_, $ENV{col}), next;
      /^.{$h}/g; /\G(\S+)/ and print $1;
   ' yourfile

REVISION첫 번째 줄에서는 index() 현재 줄의 연산을 사용하여 위치를 계산합니다 $_. 나머지 모든 줄에 대해서는 /^.../g를 일치시켜 이 위치를 건너뜁니다. 그런 다음 앵커 포인트를 사용하여 \G중단한 부분부터 일치를 시작하고 외부에서 공백이 아닌 문자를 가져옵니다 \S+.

관련 정보