LINUX.ORG.RU

вложенные циклы - конкатенация имен из разных циклов

 


1

1

Всем привет! подскажите плиз. что то не могу додумать. есть два цикла один получает через find путь до файла, второй вложенный получает содержимое файла «Хранилище сертификатов». Никак не могу объединить, что бы имя из первого цикла добавлялось ко всем именам из второго цикла. вывожу через echo $NAME1-$NAME2 в итоге имя от первого цикла только добавляется к одной переменной (название сертиф) к имени второго цикла. пример /ssl/truststore.jsk-root client1 а так как в заббиксе необходимо, что бы все итемы были уникальными, то выглядеть должно вот так как ниже /ssl/truststore.jsk-root /ssl/truststore.jsk-client1

for qq in $(find /ssl/ -name "*.jks");do
  NAME1=${qq};     
    for i in qq ; do
      NAME2=$(./t.sh ${qq}|grep Owner |sed 's/,.*//'|sed 's|.*=||'|sed s/' '//g |awk '! ( $0 in a) {a[$0];print}');
      echo $NAME2;
    done
done

потом планирую запихнуть длинное название в json

|jq -Rn '{data: [inputs|{"#SSLNAME":.}]}' 

может кто направит в нужное русло? спасибо!


Разве во втором цикле не так должно быть?

for i in ${qq}; do

anonymous
()

У тебя вложенный цикл for i in qq ; do вообще никак не используется. И по твоему примеру неясно, чего тебе надо, в нём нет того, что ты словами описал.

legolegs ★★★★★
()
Ответ на: комментарий от legolegs

удаляет пробелы. jks, c jsk опечатался.

taku
() автор топика
Ответ на: комментарий от legolegs

у меня первый цикл вытаскивает пути до файлов второй вытаскивает название сертификатов из хранилищ и т.к. хранилищ много и внутри одинаковые корневые, то мне из двух циклов нужно делать одно значение. во вложенном цикле он выводит $NAME2; только значение первого не присваивает.

taku
() автор топика
Ответ на: комментарий от legolegs

осталось на работе завтра смогу, спасибо!

taku
() автор топика
Ответ на: комментарий от legolegs
#!/bin/bash
echo -e "\n"
cd `pwd`

echo "/usr/bin/keytool -v -list -keystore \${1}<<EOF">t.sh
echo "">>t.sh
echo "EOF">>t.sh
echo "">>t.sh
chmod +x t.sh

for qq in $(find /ssl/ -name "*.jks");do
	NAME1=${qq};
		for i in qq ; do
			NAME2=$(./t.sh ${qq}|grep Owner |sed 's/,.*//'|sed 's|.*=||'|sed s/' '//g |awk '! ( $0 in a) {a[$0];print}');
			echo $NAME1-$NAME2
        done
done
echo -e "\n"
exit
taku
() автор топика
Ответ на: комментарий от taku

Мне интересно, тот, кто это писал, он вообще в себе был? Тут же такая ересь, что просто шок.

Объясни по человечески задачу на примере. Без этого не разобраться, что тебе надо.

anonymous
()
Ответ на: комментарий от anonymous

Мне нужно вытаскивать имя сертификата из хранилищ, которые находятся в различных каталогах, добавлять к нему путь до хранилища(jks). хранилищ несколько, в разных хранилищах есть одинаковые сертификаты, поэтому соединяя путь и названия хранилища, я должен на выходе получить уникальный итем, а дальше запихнуть в JSON и в заббикс LLD

taku
() автор топика
Ответ на: комментарий от taku

Про пример ты не прочитал? Как определять нужные тебе объекты перед добавлением их в json? Пиши конкретно. Вода твоя не помогает решать вопрос.

anonymous
()
Ответ на: комментарий от taku

Больше grep-ов, sed-ов, awk, эти боги изголодались, бедненькие! Зачем чтоб выполнить команду вы пишите самомодифицируемый скрипт? Ваш скрипт на AI совсем не тянет. Это делается просто формированием аргументов для вызова из самого скрипта. Вычитание для строк в принципе странная операция и уж точно в bash-е её нет, конкатенация строк в bash-е проще некуда. Без примера совсем непонятно, вам одну строку надо или набор строк, где придётся делать в общем виде массив, если сами строки могут содержать пробелы.

vodz ★★★★★
()
Ответ на: комментарий от anonymous

Про пример, не совсем понял вывод сейчас такой для двух разных jks TestIssuingCA 00CA0001CTTLSEPKkmusr-/ssl/t_psi.jks

TestRootCA2 TestIssuingCA-/ssl/ebk/truststore.jks

а нужно: TestIssuingCA-/ssl/t_psi.jks 00CA0001CTTLSEPKkmusr-/ssl/t_psi.jks

TestRootCA2-/ssl/ebk/truststore.jks TestIssuingCA-/ssl/ebk/truststore.jks

конкатенация простая, но работает не так как хотелось бы, возможно не там вывожу.

taku
() автор топика
Ответ на: комментарий от taku

Я не понимаю, ты то ли тролль, то ли ты не очень сообразительный… Выложи пример нормально оформленных исходных данных, из которых должен формироваться конченый путь для добавления в джсон. Пример для одаренных

Есть два пути
/tmp/1/2/3/4/file.jks
/tmp/papka_json

Нужно сформировать
/tmp/papka_json/4/file.jks

По тому, что ты пишешь, вообще не понятно, где что начинается и заканчивается. Какие-то пробелы (они часть пути или имени файла?), какие то циклы.

anonymous
()
Ответ на: комментарий от anonymous

исходные данные

Хранилище /ssl/t_psi.jks Сертификаты TestIssuingCA 00CA0001CTTLSEPKkmusr

Хранилище /ssl/ebk/truststore.jks Сертификаты TestRootCA2 TestIssuingCA

Нужно вывести в JSON

{
  "data": [
    {
      "#SSLNAME": "/ssl/t_psi.jks-TestIssuingCA"
    },
	    {
      "#SSLNAME": "/ssl/t_psi.jks-00CA0001CTTLSEPKkmusr"
    },
		{
      "#SSLNAME": "/ssl/ebk/truststore.jks-TestRootCA2"
    },
	    {
      "#SSLNAME": "/ssl/ebk/truststore.jks-TestIssuingCA"
    }
  ]
}
taku
() автор топика
Ответ на: комментарий от taku

Эти строки

Хранилище /ssl/t_psi.jks Сертификаты TestIssuingCA 00CA0001CTTLSEPKkmusr

Хранилище /ssl/ebk/truststore.jks Сертификаты TestRootCA2 TestIssuingCA

Откуда их брать? Это все одна строка? Одна строка - один файл? Или это данные на вход?

anonymous
()
Ответ на: комментарий от anonymous

Проще говоря, какой объект нужно итерировать, чтобы получить эти строки для дальнейшей обработки? Это строки из одного файла?

anonymous
()
Ответ на: комментарий от anonymous

Откуда их брать?

Это у него получается внутри вложенного цикла, данные для которого получаются от самомодифицируемого скрипта, после вызова которого идёт охрененно «нужная» цепочка grep/sed*/awk. По-моему это какая-то ментальная проблема.

vodz ★★★★★
()
Ответ на: комментарий от anonymous

/ssl/t_psi.jks - путь до файла после

 |grep Owner |sed ‘s/,.*//’|sed ‘s|.*=||’|sed s/’ ’//g |awk ‘! ( $0 in a) {a[$0];print}’
получаю наименования сертификатов в разных строчках TestIssuingCA 00CA0001CTTLSEPKkmusr необходимо к имени сертификатов добавить путь.

taku
() автор топика
Ответ на: комментарий от taku

Я хотел помочь, но раз из тебя клещами инфу не вытянешь, делай сам.

anonymous
()
Ответ на: комментарий от taku

Скрипт действительно кошмарный. Вот прямо со второй строки странности, а третья вообще шедевр.

Если твой keytool работает так-же как и мой (а пример выхлопа ты не предоставил), то вот это сделает тебе список

#!/bin/bash

function keytoollist
{
# скармливаем пустой пароль
/usr/bin/keytool -v -list -keystore "$1" < /dev/null
# другой вариант
# /usr/bin/keytool -v -list -keystore "$1" <<<$'\n'
}
echo
for FILENAME in $(find /ssl/ -name "*.jks"); do
    for OWNER in $(
        keytoollist "${FILENAME}" | awk -vFS='[:=, ]+' \
            '
                $1=="Owner" &&
                $2=="CN" &&
                !($3 in uniqueowners) {
                    uniqueowners[$3];print $3
                }
            '
    ); do
        echo "${FILENAME}-${OWNER}"
    done
done
echo

вывод

/ssl/файлключа1.jks-Myname1
/ssl/файлключа1.jks-Myname2
/ssl/файлключа2.jks-Myname1
/ssl/файлключа2.jks-Myname2
/ssl/файлключа2.jks-Myname3
legolegs ★★★★★
()
Последнее исправление: legolegs (всего исправлений: 1)
Ответ на: комментарий от legolegs

Спасибо, классный и небольшой скрипт, вот бы мне так уметь :( по поводу примера, был уверен, что он одинаковый. Всем спасибо, помогли!!!

taku
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.