Bash:抓取命令行程序执行的输出并设置为变量

时间:2012-09-05 20:45:32

标签: bash amazon-web-services awk centos elastic-beanstalk

我在CentOS中运行一个命令,它给出了一个多行字符串的输出,我想获取该输出的某个部分并将其设置为变量。

例如,我运行命令行

ebi-describe-env

我的输出如下:

ApplicationName | CNAME | DATECreated | DateUpdated | Description | EndpointURL |   
EnvironmentID | EnvironmentName | Health | Stack | Status | TemplateName | 
Version Label -------------------------------------
Web App | domain.com | 2012-02-23 | 2012-08-31 | |
anotherdomain.com | e-8sgkf3eqbj | Web-App-Name | Status | 
Linux | Ready | N/A | 20120831 - daily

我想抓住每个调用在同一个地方的多字符串的'20120831-daily'部分并将其设置为变量。我相信'------'意味着新的一条线或输出。

我非常擅长打击脚本,所以任何帮助都会很棒。谢谢。

注意:之前我问过这个问题并用awk解决了,但事实证明这只是一行输出。 Previous question

2 个答案:

答案 0 :(得分:2)

您可以轻松添加模式以匹配特定行与上一个答案:

awk -F"|" 'NR == 6 {print $NF}'

"模式"对于awk中的块,可以是任何条件。在我的示例中,NR是行号,因此打印第6行的最后一个(管道分隔的)单词。如果您想要具有&#34的行,也可以使用类似/Linux/的模式。版本; Linux"在它。

答案 1 :(得分:1)

这应该可以解决问题:

dateStr=$( ebi-describe-env | grep "Linux | Ready" | cut -t"|" -f4 )

运行命令并通过grep管道输出,它只传递包含字符串“Linux | Ready”的行(井,行)。然后将其传递给cut,对待“|”作为分隔符,仅打印第4个字段。然后,$(...)构造捕获输出并将其分配给变量dateStr

Ben Jackson的awk解决方案稍微好一些,它可以取代我的grep/cut组合:

dateStr=$( ebi-describe-env | awk -F"|" 'NR==6 {print $NF}' )