Я пытаюсь проанализировать строки файла .aws/config или .aws/credentials определенного профиля, такого как [default] или [prod].

Пример файла

[default]
region = us-east-1
output = json

[nonprod]
region = us-east-1
output = json

[uat]
region = us-east-2
output = json

[prod]
region = us-east-1
output = json

Есть ли у кого-нибудь скрипт (aws, sed, grep и т. д.), который ищет (и отображает) строки после, например, [default] до начала следующего профиля, или если поиск prod начинается с [prod] до конца файла?

Примеры

searchawsconfig default
searchawsconfig prod
-1
Bernie Lenz 17 Сен 2020 в 16:45
1
 – 
Quasímodo
17 Сен 2020 в 17:21
Абзацный подход довольно удобен, но мне было интересно, есть ли какие-либо другие решения, кроме пустых разделённых абзацев? например возможно, найдите имя профиля, начните вывод следующей строки, если в начале строки есть [?
 – 
Bernie Lenz
17 Сен 2020 в 21:16
Что такое «профиль» — это имя в квадратных скобках?
 – 
roaima
21 Сен 2020 в 01:55
Да, aws называет эти профили
 – 
Bernie Lenz
21 Сен 2020 в 15:24

3 ответа

Если профили разделены пробелами, вы можете использовать awk в режиме абзаца, например.

$ awk -v RS= -v p='[uat]' '$1 == p' yourfile
[uat]
region = us-east-2
output = json
3
steeldriver 17 Сен 2020 в 16:51

Perl в «режиме абзаца»:

$ perl -00 -ne 'print if /\[default\]/' file 
[default]
region = us-east-1
output = json

Или

$ perl -00 -ne 'print if /\[prod\]/' file 
[prod]
region = us-east-1
output = json

Вы можете превратить это в функцию оболочки, добавив эти строки в файл инициализации вашей оболочки (например, ~/.bashrc):

searchawsconfig(){
    perl -00 -ne 'print if /\['"$1"'\]/' "$2" 
}

Затем вы можете:

$ searchawsconfig prod file 
[prod]
region = us-east-1
output = json
2
terdon 17 Сен 2020 в 17:27

Аннотация:

awk '$1==p' RS= p='[default]' ./tst

Использование режима абзаца для разделения входного файла на записи, разделенные «пустой строкой» (две последовательные \n).

Вы можете выполнить сопоставление с регулярным выражением с помощью (escape [], поскольку они являются специальными в регулярном выражении) (используйте ^, чтобы отметить начало строки):

awk -vRS='' '/^\[default\]/' ./tst

Или вы можете выполнить сопоставление текста (полная первая строка) с помощью:

awk -vRS='' '$1 == "[default]"' ./tst

Или (более гибко) используйте переменные, установленные в командной строке:

awk '$1==p' RS= p='[default]' ./tst

Обязательно используйте некоторую форму пути, например относительный путь ./, чтобы имя файла анализировалось как имя файла, даже если оно содержит =.

Или, используя переменные среды:

RS='' SECTION='default'   \
    awk   'BEGIN{RS=ENVIRON["RS"]} $1=="[" ENVIRON["SECTION"] "]" ' \
        ./tst
1
ImHere 17 Сен 2020 в 20:49