搜索多线模式在 文件 和 grep 是 琐碎的. 反转该模式则不然。
背景:我想创建没有密码的干净变量文件,以便我可以将它们提交到存储库中。
包含加密密码的变量文件示例:
ansible_user: rick
ansible_become_password: !vault |
$ANSIBLE_VAULT;1.1;AES256
35623732646263636163383738353230626565383533626261313564383832643334363632383134
3833316539376436333462303564636236646662376535300a356631346166626632333365353465
30343138313363666434343938393464343861666234633434383037393230633333333364383835
3962383339373731610a316362326239386539633638646331636633333330633231383730323634
33653332353239353662366631373037653135303163663365633532643535663933
never: 'gonna,give,you,up'
预期结果:
ansible_user: rick
never: 'gonna,give,you,up'
我可以使用以下命令轻松匹配包含密码的行:
grep -Pz '.+\: !vault \|(\n\s+.+){2,}' host_vars/host.yml
问题:参数-v
通常会反转结果,但不适用于-P
如何创建没有密码行的变量文件的副本?
答案1
这是很不礼貌的,因为如果你有其他多行变量它就无法工作,但在这种情况下:
grep -v -e password -e '^\s'
因此,它会跳过以空格开头的任何内容。如果您想要更优雅的解决方案,我会使用命令行程序来处理 yaml 文件,看看是否可以排除值。使用 cli 处理 yaml 文件已在本站的其他帖子中详细介绍:https://stackoverflow.com/questions/5014632/how-can-i-parse-a-yaml-file-from-a-linux-shell-script
答案2
我使用以下方法使它工作pcregrep
:
pcregrep -vM "\!vault.+\n(\s{4,}.+\n){2,}" host_vars/host.yml
但这需要安装 pcregrep,至少在 ubuntu 上这不是标准。因此我仍然愿意接受更好的建议。