Извлечение данных подключения из tnsnames.ora через awk - PullRequest
0 голосов
/ 28 мая 2018

Я пытаюсь построить процедуру автоматизации, основанную на данных соединения от tnsnames.ora, который является базой соединений оракула для базы данных.

Типичная сборка TNS выглядит так, но подключений намного больше, чем 1:

" 

MY_BASE= 
  (DESCRIPTION= 
    (ADDRESS= 
      (PROTOCOL=TCP) 
      (HOST=10.20.30.40) 
      (PORT=1234) 
    ) 
    (CONNECT_DATA= 
      (SERVER=dedicated) 
      (SERVICE_NAME=MY_SERVICE) 
    ) 
  ) 

"

Мне нужно извлечь базовые данные о подключении, которые будут выглядеть так: BASE_NAME HOST PORT SERVICE_NAME более или менее будет выглядеть так:

MY_BASE 10.20.30.40 1234 MY_SERVICE

Некоторые подключения получили более одной службы, но я не буду вас беспокоитьпо этой причине я не знаю, как сделать его переменным в конце: P

Моя цель - составить список в автоматизации jenkins и сделать так, чтобы он возвращал список соединений в флажке.Чем я и сделаю переменные из этих данных соединения, так что я смогу сделать то же самое во многих базах данных одновременно.

Больше или меньше ...

Есть идеи?Что читать, что найти, чему поучиться у AWK (потому что это БОЛЬШОЙ инструмент).

С наилучшими пожеланиями!

Ответы [ 3 ]

0 голосов
/ 28 мая 2018

После awk может вам помочь (в случае нескольких записей TNS это тоже должно работать).

awk -F"[=)]" '
/^"/{
  flag=1;
  next}
flag && NF{
  value=$1;
  flag=""}
/HOST/{
  value=value OFS $(NF-1);
  next}
/PORT/{
  value=value OFS $(NF-1);
  next}
/SERVICE_NAME/{
  print value OFS $(NF-1);
  value=""}
END{
  if(value){
    print value}
}'   Input_file

Выполнение вышеуказанной команды: Допустим, следующим является тестовый файл Input_file.

cat Input_file
"

MY_BASE=
  (DESCRIPTION=
    (ADDRESS=
      (PROTOCOL=TCP)
      (HOST=yourip)
      (PORT=1234)
    )
    (CONNECT_DATA=
      (SERVER=dedicated)
      (SERVICE_NAME=MY_SERVICE)
    )
  )
"

"

MY_BASE=
  (DESCRIPTION=
    (ADDRESS=
      (PROTOCOL=TCP)
      (HOST=yourip)
      (PORT=1234)
    )
    (CONNECT_DATA=
      (SERVER=dedicated)
      (SERVICE_NAME=MY_SERVICE)
    )
  )


"

Теперь после выполнения кода, приведенного выше, после будет вывод.

MY_BASE yourip 1234 MY_SERVICE
MY_BASE yourip 1234 MY_SERVICE
0 голосов
/ 29 мая 2018

Прежде всего, спасибо за ваши ответы.В общем, я проверил, и похоже, что мои tnsnames не так стандартизированы, как я.

Первые результаты хороши, как

MY_BASE 10.20.30.40 1234 MY_SERVICE

Но дальнейший анализ показывает, что результаты выглядят как ...

10.20.30.40 1234 MY_SERVICE MY_BASE 

или

MY_SERVICE 1234 10.20.30.40 

и т. Д. *

Целые результаты перемещаются, и я не могу их изменить.

Есть ли тампредотвратить попадание результата во вторую строку или добавить несколько разных результатов в одну строку?

Например, сделать так, чтобы он обычно читал это ... Установить в новой строке результат, начинающийся с буквы (не числа или специального знака) и заканчивающийся символом "=".Установите после него значение betwean HOST = и ближайший знак ")" и оставьте после него Spacia.Установите после него значение betwean PORT = to near ")" signt и оставьте после него пробел.Установите после него значение betwean SERVICE_NAME = для ближайшего ")" и оставьте после него пробел.

И снова новое слово, начинающееся с буквы, в конце которой стоит "=", снова начинает его.

Ну ... это мой образ мышления.Понятия не имею, правильно ли это: / Еще раз спасибо.

С наилучшими пожеланиями.

0 голосов
/ 28 мая 2018

Если это не все, что вам нужно:

$ cat tst.awk
BEGIN { FS="[()=]" }
NF==2 && /=/ { f["BASE_NAME"] = $1 }
NF==4 { f[$2] = $3 }
END { print f["BASE_NAME"], f["HOST"], f["PORT"], f["SERVICE_NAME"] }

$ awk -f tst.awk file
MY_BASE 10.20.30.40 1234 MY_SERVICE

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

...