Precisa extrair parte da string usando shell [duplicate]

1

Eu tenho um script como

#/bin/bash -x
LASTBUILD=' 174254491  2018-08-08T11:04:40Z  gs://abc/kishor/5.4.0.61/xyz-5.4.0-61.tgz
 TOTAL: 46 objects, 7325896651 bytes (6.82 GiB)'

echo "this is the LASTBUILD ============== $LASTBUILD"

LATESTBUILD=echo $LASTBUILD | cut -d ' ' -f 3

echo "this is the LATESTBUILD ############### $LATESTBUILD"

Após a execução mostrar o resultado abaixo,

[root@root ~]# echo $LATESTBUILD

[root@root ~]#

Meu resultado esperado é o seguinte,

[root@root ~]# echo $LATESTBUILD
gs://abc/kishor/5.4.0.61/xyz-5.4.0-61.tgz
[root@root ~]#

O código acima não está funcionando.

PS: Também tentei usar o awk mas não funcionou,

LATESTBUILD=$LASTBUILD | awk -F '/' '{print $5}'
    
por Hemant 09.08.2018 / 15:21

4 respostas

1

Existem alguns problemas com o seu script:

  1. Seu hash bang é inválido. Você tem #/bin/bash -x e deve ser #!/bin/bash -x
  2. Sua variável LASTBUILD é estranha. Cada coluna é separada por espaços duplos, o que fará com que cut aja de maneira estranha, e você também não quer uma nova linha com corte.
  3. LATESTBUILD=echo $LASTBUILD | cut -d ' ' -f 3 não é nada. Isso deve estar na substituição do comando , mas mesmo assim não funcionará por causa do espaçamento duplo. Deve ser: LATESTBUILD=$(cut -d ' ' -f5 <<<"$LASTBUILD")
  4. As variáveis definidas dentro do seu script não estarão disponíveis fora dele, portanto, fazer echo $LATESTBIULD na linha de comando depois que o script for executado não funcionará e não funcionará.

Aqui está uma versão funcional do seu script:

#!/bin/bash

LASTBUILD='174254491   2018-08-08T11:04:40Z  gs://abc/kishor/5.4.0.61/xyz-5.4.0-61.tgz TOTAL: 46 objects, 7325896651 bytes (6.82 GiB)'

echo "this is the LASTBUILD ============== $LASTBUILD"

LATESTBUILD=$(cut -d ' ' -f5 <<<"$LASTBUILD")

echo "this is the LATESTBUILD ############### $LATESTBUILD"
    
por 09.08.2018 / 15:43
2
awk '{ print $3 }' <<< $LASTBUILD

O separador de campos padrão no awk em um espaço e, portanto, imprime o campo delimitado pelo terceiro espaço.

    
por 09.08.2018 / 15:28
1

Você pode fazer isso (cuidadosamente) com o shell:

LASTBUILD=' 174254491  2018-08-08T11:04:40Z  gs://abc/kishor/5.4.0.61/xyz-5.4.0-61.tgz TOTAL: 46 objects, 7325896651 bytes (6.82 GiB)'
set -f               # disable filename generation (globbing)
set -- $LASTBUILD    # specifically un-quoted, to allow splitting
LATESTBUILD=$3
    
por 09.08.2018 / 15:53
0

Que tal

read _ _ LATESTBUILD _ <<< $LASTBUILD
    
por 09.08.2018 / 15:57