![bash 脚本从最后一个输出行中提取字符串](https://linux22.com/image/102669/bash%20%E8%84%9A%E6%9C%AC%E4%BB%8E%E6%9C%80%E5%90%8E%E4%B8%80%E4%B8%AA%E8%BE%93%E5%87%BA%E8%A1%8C%E4%B8%AD%E6%8F%90%E5%8F%96%E5%AD%97%E7%AC%A6%E4%B8%B2.png)
此 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
并验证其格式为 ami-and-a-mix-of-alphanumeric else echo“bad string”并退出脚本
如何做呢?
答案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
位表示“使用空格作为字段分隔符并给我第二个字段”。
那么正则表达式也变得更短:
if [[ ! "$line" =~ ^ami-[0-9a-z]{8}$ ]]; then
echo "bad string"
exit 1
fi