[英]Grep the entire text after a certain word using grep/awk/sed
我們使用 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 來獲得預期的輸出?
通過您顯示的嘗試,請嘗試以下代碼。
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}'
你可以使用這個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;}
{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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.