【问题标题】:Bash: Grab part of string from a command line outputBash:从命令行输出中获取字符串的一部分
【发布时间】:2012-08-26 18:14:04
【问题描述】:

我在 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 行设置为变量。

我对 bash 脚本非常陌生,所以任何帮助都会很棒。谢谢。

【问题讨论】:

  • 这一切都应该在一条线上吗?
  • 是的,应该是一行。

标签: bash awk grep gawk amazon-elastic-beanstalk


【解决方案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"

【讨论】:

  • 在这种情况下是否有理由避免使用 Awk? awk 由 POSIX 指定,由 Busybox 提供。较小的嵌入式系统没有它,也许?这不是一个修辞问题。
  • @ngks 不,我只是想指出 bash 的内部字符串结构可以胜任这项特殊工作。
  • 酷,正如@Levon 所说,总是有其他方法。
【解决方案2】:

使用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 变量,表示输入字段的数量,变量前面的$ 访问该元素,即在本例中为行中的最后一个字段($NF) .

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

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

【讨论】:

  • @MichaelLe 更新了答案以显示对 shell 变量的赋值
  • 感谢您的解释和步骤。
  • @MichaelLe 很高兴能够提供帮助。
  • 我意识到我有一个更大的输出并格式化了我的原始问题。我尝试使用 $(NF-1) 等来获取下一个字段,但事实证明它位于错误的行上。我将如何转到输出中的下一行?谢谢。
  • @MichaelLe 这是一个非常不同的问题,确实值得提出自己的新问题。抓住一行的一部分(这是您最初要求的)然后遇到一个由多行组成的不同问题(总是?有时?)输入是一回事,您感兴趣的部分可能在不同的行上(如果我理解你的评论)。我建议您接受解决您发布的问题的答案,然后仔细制定另一个单独的问题以发布新问题(包括准确的输入数据和所需的输出)。与这里的其他解决方案一样,AWK 是面向行的。
【解决方案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

【讨论】:

  • 你能解释一下 -f13 的作用吗?
  • 如果您可以访问 Unix/Linux/*nix 机器,请打开终端并输入 man cut。简而言之,-d"|" 表示| 符号分隔字段,-f13 部分要求第 13 个字段。剪切-d"|" -f13
猜你喜欢
  • 2020-05-19
  • 2014-09-26
  • 2011-07-02
  • 1970-01-01
  • 1970-01-01
  • 2017-06-19
  • 1970-01-01
  • 2014-08-31
相关资源
最近更新 更多