bash script para extrair string da última linha de saída

0

Este script bash tenta obter a string "ami-774b7314" da saída do seguinte comando para que possa ser usado como entrada para outro comando no mesmo script:

aws ec2 describe-images --region ap-southeast-2 --owners amazon --output text --query 'Images[].{A1name:Name,A2id:ImageId}' --filters Name=is-public,Values=true,Name=name,Values=amzn-ami-*.*.*-amazon-ecs-optimized | sort

amzn-ami-2016.03.i-amazon-ecs-optimized ami-22a49541
amzn-ami-2016.03.j-amazon-ecs-optimized ami-862211e5
amzn-ami-2016.09.a-amazon-ecs-optimized ami-73407d10
amzn-ami-2016.09.b-amazon-ecs-optimized ami-5781be34
amzn-ami-2016.09.c-amazon-ecs-optimized ami-774b7314 <===== this line

e para verificar se está no formato ami-e-a-mix-of-alfanumeric else else echo "bad string" e saia do script

Como isso pode ser feito?

    
por Fred J. 08.01.2017 / 23:13

1 resposta

3

O comando tail pode ser usado para isso. Ele fornece as últimas linhas de entrada (10 por padrão) como saída (a "cauda" dele).

Com o sinal -n , você pode especificar exatamente quanto da cauda gostaria de ter:

aws ec2 ... | sort | tail -n 1

Para verificar se segue o formato correto, você pode fazer

line="$( aws ec2 ... | sort | tail -n 1 )"

if [[ ! "$line" =~ ^amzn-ami-[0-9]{4}\.[0-9]{2}\.[a-z]-amazon-ecs-optimized\ ami-[0-9a-z]{8}$ ]]; then
    echo "bad string"
    exit 1
fi

Se você quiser apenas o último bit da última linha, use cut para recortar:

line="$( aws ec2 ... | sort | tail -n 1 | cut -d ' ' -f 2 )"

O -d ' ' -f 2 bit diz "use espaço como delimitador de campo e forneça o segundo campo".

Em seguida, a expressão regular também se torna mais curta:

if [[ ! "$line" =~ ^ami-[0-9a-z]{8}$ ]]; then
    echo "bad string"
    exit 1
fi
    
por 08.01.2017 / 23:17