使用 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
我们使用 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