使用 grep/awk/sed 在特定单词后 Grep 整个文本

Grep the entire text after a certain word using grep/awk/sed

我们使用 Hashicorp 保管库来存储证书和密钥。 我想检索存储在保管库中的 certs/keys。 使用 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 获得预期的输出?

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

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

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

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

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

你可以使用这个 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 进行替换,只需打印即可。
$ vault get /mysecret.key | awk 'sub(/^password[[:space:]]*/,""){f=1} f'
-----BEGIN RSA PRIVATE KEY-----
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
-----END RSA PRIVATE KEY-----

这可能适合您 (GNU sed):

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