【问题标题】:Grep the entire text after a certain word using grep/awk/sed使用 grep/awk/sed 在某个单词之后对整个文本进行 grep
【发布时间】:2021-07-12 10:32:07
【问题描述】:

我们使用 Hashicorp 保险库来存储证书和密钥。 我想检索存储在保险库中的证书/密钥。 使用 Vault API 命令,我得到以下输出

vault get /mysecret.key
output:
====== Data ======
Key         Value
---         -----
password    -----BEGIN RSA PRIVATE KEY-----
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
-----END RSA PRIVATE KEY-----

预期输出:

-----BEGIN RSA PRIVATE KEY-----
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
-----END RSA PRIVATE KEY-----

试过了:

vault get /mysecret.key | sed -n '/^password/,$p'

password    -----BEGIN RSA PRIVATE KEY-----
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
-----END RSA PRIVATE KEY-----

如何使用 grep/awk/sed 来获得预期的输出?

【问题讨论】:

  • 您可以发出 vault 命令来查询特定字段。 vault kv get -field=password /mysecret.key 或类似的命令。现在不记得确切的命令了。

标签: awk sed grep


【解决方案1】:

根据您显示的尝试,请尝试以下代码。

your_API_command | 
awk -v RS= 'match($0,/-+BEGIN.*END RSA PRIVATE KEY-+/){print substr($0,RSTART,RLENGTH)}'

解释: 简单的解释是,运行您的 API 命令并将其输出作为标准输入发送到 awk 命令。在使用 nullify RS 然后使用 match 函数匹配字符串从 -(1 次或多次出现),然后是 BEGIN 直到字符串 END RSA PRIVATE KEY 后跟 1 次或多次出现 -

第二个解决方案:这里是第一个解决方案的一点调整形式,在 GNU awk 中编写和测试。

your_API_command | awk -v RS='-+BEGIN.*END RSA PRIVATE KEY-+' 'RT{print RT}' 

【讨论】:

  • 有了这些数据,你可以:awk -v RS= 'match($0,/-+BEGIN/){print substr($0,RSTART)}' 但我想匹配结尾也很好。
  • @RavinderSingh13 感谢您的回答。对其他文件也使用了类似的查询。当将此输出保存到 echo Key=$(API | awk ...) 之类的变量时,我会丢失格式并将其打印为字符串。使用变量时有没有办法保留格式?
  • @ERR,要将其保存到变量中,请使用类似:var=$(API | awk -v RS= 'match($0,/-+BEGIN.*END RSA PRIVATE KEY-+/){print substr($0,RSTART,RLENGTH)}' ) 一次,如果这对您有帮助,请告诉我?
  • 它像这样打印输出,作为单行值 -----BEGIN RSA PRIVATE KEY----xxxxxxyyyyyyy-----END RSA PRIVATE KEY-----跨度>
  • @ERR,像这样打印:echo "$var" 在打印值时使用" 将新行保留在变量中。
【解决方案2】:

你可以使用这个sed:

vault get /mysecret.key | sed -n '/^password[[:blank:]]*/,$ {s///; p;}'

-----BEGIN RSA PRIVATE KEY-----
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
-----END RSA PRIVATE KEY-----

命令详情:

  • -n: 禁用正常打印
  • /^password[[:blank:]]*/,$:模式匹配从 password 开始,后跟 0 或空格直到文件结尾
  • {s///; p;}:对于匹配块,通过从输出中删除 password 后跟 0+ 空格并使用 p 进行替换,只需打印即可。

【讨论】:

    【解决方案3】:
    $ vault get /mysecret.key | awk 'sub(/^password[[:space:]]*/,""){f=1} f'
    -----BEGIN RSA PRIVATE KEY-----
    xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
    -----END RSA PRIVATE KEY-----
    

    【讨论】:

      【解决方案4】:

      这可能对你有用(GNU sed):

      sed -z 's/.*\npassword\s*//' file
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-25
        • 2020-08-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多