【问题标题】:Get second column of line with certain text from command output directly [duplicate]直接从命令输出中获取带有某些文本的第二列[重复]
【发布时间】:2018-06-20 12:52:32
【问题描述】:

我正在尝试提取多行命令输出的第二列中的文本。

该命令显示如下输出。

Nginx configuration  wp basic (enabled) 
PHP Version      7.0    
HHVM             disabled    
SSL          enabled    
SSL PROVIDER             Lets Encrypt    
SSL EXPIRY DATE          Wed Apr 11 06:29:29 UTC 2018

access_log       /var/www/website.com/logs/access.log    
error_log        /var/www/website.com/logs/error.log    
Webroot          /var/www/website.com    
DB_NAME          certainDBName    
DB_USER          certainDBUser    
DB_PASS          passwordString

我想从命令输出中读取DB_PASS 行并将passwordString 提取到一个变量中,直接从我的第一个命令输出中提取而不写入文件。

【问题讨论】:

    标签: linux bash shell


    【解决方案1】:

    您可以使用awk轻松做到这一点

    awk '$1=="DB_PASS" { print $2 }' test.log > output.txt
    

    这意味着在第 1 列等于“DB_PASS”的行中打印第 2 列,假设您的结果在 test.log 文件中

    【讨论】:

    • +1 嗯,我相信这是最理想的方法 :-) 但是操作不希望将结果写入文件。相反,您应该使用命令替换 $() 功能将结果写入变量。
    • 是的,但我认为它可以很容易地转换为从管道获取输入并将其保存到变量的命令,我给出的想法不是为你们编码:)
    • 我可以使用我的 info 命令作为即时输入来使用此命令吗?而不是将第一个输出写入文件?
    【解决方案2】:

    使用单个 awk 命令:

    pass_str=$(awk '/^DB_PASS/{ print $2; exit }' file)
    

    $ echo "$pass_str" 
    passwordString
    

    【讨论】:

    • 我如何使用命令输出作为 awk 命令的输入参数而不是文件?它只是为了避免编写文件。
    • @eifersucht,通过这个方案:pass_str=$(awk '/^DB_PASS/{ print $2; exit }' <(some_command))
    • 这是我问题的完美答案
    【解决方案3】:

    您可以使用@RomanPerekhrest 建议的awk 或使用sed

    sed -n 's/DB_PASS \(.*\)/\1/p' <youfile>
    

    【讨论】:

    • 这行得通,但正如你我所知,这是很难做到的。 awk 更适合这种工作。您可能希望在-n 之后添加--,以便您还可以接受以破折号开头的文件名,例如-my-file
    • @sjsam hehe.. 是的,我们有。这是我想到的第一个答案。我留下了答案,因为看到多个解决方案总是很好
    猜你喜欢
    • 2013-04-14
    • 2019-05-18
    • 2014-05-24
    • 1970-01-01
    • 2014-06-30
    • 2023-03-26
    • 2021-11-10
    • 1970-01-01
    • 2014-04-19
    相关资源
    最近更新 更多