Назад | Перейти на главную страницу

grep exclude многострочный шаблон

Поиск многострочных шаблонов в файлы с участием 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

Как я могу создать копию файлов переменных без строк пароля?

Я получил его, используя pcregrep:

pcregrep -vM "\!vault.+\n(\s{4,}.+\n){2,}" host_vars/host.yml

Но для этого требуется установить pcregrep, который, по крайней мере, в ubuntu не является стандартным. Поэтому я все еще открыт для лучших предложений.

Это хакерство, потому что это не сработает, если у вас есть другие многострочные переменные, но в этом случае:

grep -v -e password -e '^\s'

Таким образом, он просто пропустил бы все, что начинается с пробела. Если вам нужно более элегантное решение, я бы использовал программу командной строки для работы с файлами yaml и посмотрел, можете ли вы исключить значения. Работа с файлами yaml с помощью cli подробно описана в других сообщениях на этом сайте: https://stackoverflow.com/questions/5014632/how-can-i-parse-a-yaml-file-from-a-linux-shell-script