Bash:从命令行输出中获取部分字符串

时间:2012-08-31 23:30:06

标签: bash awk grep gawk 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'部分(此字符串将始终更改但保持在同一位置)并将其设置为变量。

最初我以为我可以使用grep或sed并在每个'|'之后打印一行并将第13行设置为变量。

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

3 个答案:

答案 0 :(得分:9)

使用awk

awk -F"|" '{print $NF}'

这将有效:

echo " Web App | domain.com | 2012-02-23 | 2012-08-31 | | anotherdomain.com | 
       e-8sgkf3eqbj | Web-App-Name | Status | Linux | Ready | N/A | 
       20120831 - daily" | awk -F"|" '{print $NF}'

和产量:

20120831 - daily

要分配给变量data.txt包含您的字符串只是为了简单起见,它也适用于上面的echo):

$ myvar=$(awk -F"|" '{print $NF}' data.txt)
$ echo $myvar
20120831 - daily

说明

-F设置输入字段分隔符,在本例中为|NF是一个内置的awk变量,表示输入字段的数量,变量前面的$访问该元素,即在这种情况下是该字段中的最后一个字段line($NF)。

或者:您可以使用以下内容获取由空格分隔的最后三个字段(awk默认值)中的每一个:

awk '{print $(NF-2), $(NF-1), $NF}'

答案 1 :(得分:3)

Levon的回答很有效,但我只是要表明shell脚本总是有其他方法。

这个使用名为cut

的基本工具
echo "Web App | domain.com | 2012-02-23 | 2012-08-31 | | anotherdomain.com |  e-8sgkf3eqbj | Web-App-Name | Status | Linux | Ready | N/A |   20120831 - daily" | cut -d"|" -f13

答案 2 :(得分:1)

我知道这已经被接受了,但是这里是如何用纯粹的bash做的:

string="Web App | domain.com | 2012-02-23 | 2012-08-31 | | anotherdomain.com | e-8sgkf3eqbj | Web-App-Name | Status | Linux | Ready | N/A | 20120831 - daily"
myvar="${string##*| }"
echo "$myvar"