Використання shell (bash) для визначення ключа для значення з файлу


1

Я сценарію деяких розгортання додатків і розгортати процеси просування за допомогою bash (shell). Ці сценарії написані як failsafe у випадку, якщо наша платформа CI знову виходить з ладу (як це було недавно).

У цьому процесі кожна програма має текстовий файл з парами ключових значень, де ключем є ім'я регіону розгортання (dev, qa, prod)… і значенням є хеш, пов'язаний з розгортаемими файлами.

Я намагаюся визначити, як краще підходити до розпізнавання ключа замість того, щоб збирати цінність від простого пошуку файлу в… але пошук файлу в, а потім вручну порівняння значень для кожної області розгортання здається, що він повинен бути довгий шлях.

RECAP  1. У мене є значення (sha1sum), але мені потрібен ключ (и), до якого він належить  2. Визначити ключ з парою значень ключа з файлу  3. Визначити найвищу область розгортання з асоційованим значенням (тобто: кілька регіонів потенційно можуть мати одне і те ж значення в списку, ймовірність зростає, коли ми піднімаємося по ланцюжку.)

Будь-які пропозиції?

EDIT 1 Тут міститься потрібний код:

###################################################################################################
# IS THIS HASH CURRENTLY DEPLOYED SOMEWHERE ELSE? IF SO, WHERE?
###################################################################################################
grep "${deployHash}" "${deployHashHome}/${deployAppName}/${deployAppName}.manifest"
if [[ "$?" -eq 0 ]]
then
    source ${deployHashHome}/${deployAppName}/${deployAppName}.manifest


    previousDeployRegion=""
    # logThis is a custom logging function which formats logs exactly how we want, we have a Splunk parser for the format
    logThis "${scriptLogDir}/${deployLogFile}" "The hash: ${deployHash}, has been previously deployed to ${previousDeployRegion}." "INFO"
fi

Ось як виглядає файл ключ-значення:

mylocal=ca9c244aa1b40f39fd06318f2be9fbc1a82c5c5c
dev=986b747d846555f8c5e393a5cfbbd061ee9d68a7
int=53b8fa87f2241a17623ead2f94032b1d2045069e
reg=53b8fa87f2241a17623ead2f94032b1d2045069e
stage=
prod=
dr=

EDIT 2 Додано додаткові значення sha1sum у приклад файлу ключ-значення, щоб показати, як може існувати однакове значення для декількох ключів.


Я думаю, я розумію, але деякі зразки будуть хорошим стартером. Напевно, це ще один для awk.
Gombai Sándor

Дякую. Я додав приклад того, де код буде жити, і приклад файлу, де мені потрібно знайти ключ для значення, яке я вже маю.
Chris Giddings

О, вхідний зразок тут також ... так, я очікував цього.
Gombai Sándor

Відповіді:


2

Насправді, мені хотілося б бачити приклад файлу для роботи, але сам код зміцнив моє припущення.

hash="blablabla"
awk -F' *= *' -v hash="$hash" '$2 == hash { print $1 }' your.manifest | sort ...

Тут ми просто переходимо хеш до awk і просимо його розділити лінії на рівні знаки. Якщо значення, що слідує за знаком, є хешем, ми роздруковуємо значення перед знаком, сподіваємося, що область. Тоді ви можете або не можете відсортувати ці значення відповідно до ваших потреб.

Якщо ми хочемо бачити всі ключі для хешу, ми можемо використовувати це:

awk -F' *= *' -v hash="$hash" '$2 == hash { keys=(keys ? keys "," $1 : $1)}; END { print keys}' your.manifest

Якщо цікавий тільки останній ключ для хешу у файлі, то цей код виграє:

awk -F' *= *' -v hash="$hash" '$2 == hash { key=$1}; END { print key}' your.manifest

Ось як я спробував ваше рішення, але для мене це неможливо. previousDeployRegion = awk -F'*=*' -v hash=$deployHash '$2 == hash { echo $1 }' $tfDeployHashHome/$deployAppName/$deployAppName.manifest logThis "$ {tfAdminLogDir} / $ {tfDeployLogFile}" "Хеш: $ {deployHash}, раніше був розгорнутий на $ {previousDeployRegion}." "INFO" Ось вихід: 2016-02-13 19: 26: 35-05: 00: INFO: Хеш: 53b8fa87f2241a17623ead2f94032b1d2045069e, раніше був розгорнутий. Пропозиції?
Chris Giddings

Просто викиньте весь сценарій на мить, і використовуйте тільки те, що написав, і ви побачите, як він працює. Звичайно, заміна blablabla і your.manifest на реальні дані є обов'язковою.
Gombai Sándor

nvm, я змінився ' *= *' до '*=*' який зламав awk. Я виправив, що змінити його тепер збирає ключ від пари ключ-значення! СПАСИБІ! Тепер додайте підтримку для захоплення тільки останнього ключа з відповідним значенням!
Chris Giddings

Приємно чути, що. Якщо ви впевнені, що останній порядок ключ є той, який ви хочете знайти, просто залиште ще один рядок, і я покладу цю частину в код.
Gombai Sándor

Те, що я шукаю, це підтримка можливості того, що однакове значення може існувати для декількох ключів. Наприклад, скажімо, код був розгорнутий на DEV, просунутий як до INT, так і до REG, і нова побудова була розміщена тільки в DEV. На цьому етапі INT і REG мають однакове значення, але DEV не має. І якщо я "просуваю" побудову до наступного середовища "вгору", то він припустив, що я повинен висунути його до ЕТАПУ. Так? Я буду оновлювати приклад маніфесту в ОП.
Chris Giddings
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.