【问题标题】:Bash: Grabbing output of command line program execution and setting to variableBash:获取命令行程序执行的输出并设置为变量
【发布时间】:2012-08-30 15:31:55
【问题描述】:

我在 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”部分,并将其设置为一个变量。我相信 '--------' 表示新行或输出。

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

注意:我之前问过这个问题,它是用 awk 解决的,但事实证明它只是针对单行输出。 Previous question

【问题讨论】:

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


    【解决方案1】:

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

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

    awk 中块的“模式”可以是任何条件。在我的示例中,NR 是行号,以便在第 6 行打印最后一个(管道分隔的)单词。如果您想要其中包含“Linux”的行,您也可以使用类似/Linux/ 的模式。

    【讨论】:

      【解决方案2】:

      这应该可以解决问题:

      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}' )
      

      【讨论】:

        猜你喜欢
        • 2018-10-01
        • 2013-01-01
        • 2022-09-27
        • 2019-11-09
        • 2020-12-19
        • 2019-11-29
        • 1970-01-01
        • 1970-01-01
        • 2011-08-08
        相关资源
        最近更新 更多