“awk” um valor da saída irregular pelo nome da coluna

3

Estou escrevendo um script bash que usa o comando helm history (Kubernetes tool) para obter o último número de revisão da minha versão. A saída para o comando é assim:

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

O resultado esperado é retornar apenas o número 3 (último valor) da coluna REVISION . Eu posso fazer isso por enquanto usando:

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

No entanto, a "coluna" UPDATED é irregular (itens separados por espaços), e o comando acima só funciona porque a coluna REVISION vem antes de UPDATED . Se em versões futuras o comando helm history alterar a ordem das colunas, as coisas podem ficar confusas.

Um exemplo simples é se eu tentar obter o último valor usando a coluna STATUS , que vem depois de 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

Existe uma maneira de obter o último valor REVISION correto mesmo se a ordem das colunas mudar?

    
por Eduardo Baitello 03.03.2017 / 13:25

2 respostas

1

O nome da coluna a ser pesquisada é fornecido por meio do -col= na linha de comando, conforme mostrado.

O código procura o nome da coluna que começa no início da linha ou em um espaço em branco e a extensão até o início da próxima coluna ou o fim da linha é anotado.

Armado com esta informação, esperamos até o eof e extraímos a substring da última linha.

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' 
'
    
por 04.03.2017 / 23:53
0
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

Na primeira linha, calculamos a posição do REVISION usando o index() operando na linha atual $_ . Para todas as linhas restantes, passamos por cima as posições por meio de correspondência / ^.../g. Em seguida, faça uso da \G anchor para começar a correspondência de onde paramos anteriormente e pegue os caracteres \S+ que não estão no espaço.

    
por 03.03.2017 / 14:24