最後の出力行から文字列を抽出するbashスクリプト

最後の出力行から文字列を抽出するbashスクリプト

このbashスクリプトは、同じスクリプトの他のコマンドへの入力として使用できるように、次のコマンドの出力から「ami-774b7314」文字列を取得しようとします。

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

フォーマットが英数字の混在であることを確認し、そうでない場合は「無効な文字列」をエコーし​​てスクリプトを終了します。

どうすればいいですか?

ベストアンサー1

このtailコマンドは、この目的に使用できます。入力の最後の数行(デフォルトでは10行)を出力(「尾」)として提供します。

この-nフラグを使用すると、必要な尾の量を正確に指定できます。

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

正しい形式に従うことを確認するには:

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

欲しいなら最後のポイント最後の行はcut以下を使用して削除します。

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

この-d ' ' -f 2ビットは、「スペースをフィールド区切り文字として使用し、2番目のフィールドを提供します」と言います。

これにより正規表現も短くなります。

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

おすすめ記事