Автор Тема: Парсинг файла (мистика)  (Прочитано 2308 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн rjhdby

  • Постоялец
  • ***
  • Сообщений: 432
  • Рейтинг: 3
  • Пол: Мужской
    • rjhdby
    • Просмотр профиля
Парсинг файла (мистика)
« : 25 августа 2011, 11:51:21 »
HP-UX, sh

Есть файлик listener.ora
SID_LIST_LISTENER =
  (SID_LIST =
   (SID_DESC =
      (GLOBAL_DBNAME = gbadb_DGMGRL)
        (SID_NAME = gbadb)
        (ORACLE_HOME = /oracle/product/11.2.0.2)
  )
  (SID_DESC =
    (GLOBAL_DBNAME = gbadb2)
    (SID_NAME = gbadb2)
    (ORACLE_HOME = /oracle/product/11.2.0.1)
    )
)
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = TCP)(HOST = gbadb)(PORT = 1521))
      )
    )
  )
есть скриптик:
DB_NAME=gbadb
ORACLE_HOME_TMP=`paste -s listener.ora | tr -d " \t" | sed 's/.*SID_LIST_LISTENER=(SID_LIST=\(.*)))\).*/\1/g' | sed 's/))(/))\
(/g' | grep "SID_NAME=$DB_NAME)" | sed 's/.*(ORACLE_HOME=\([^)]*\)).*/\1/'`
echo $ORACLE_HOME_TMP
paste -s listener.ora | tr -d " \t" | sed 's/.*SID_LIST_LISTENER=(SID_LIST=\(.*)))\).*/\1/g' | sed 's/))(/))\
(/g' | grep "SID_NAME=$DB_NAME)" | sed 's/.*(ORACLE_HOME=\([^)]*\)).*/\1/'
Ну, то-есть, сначала я вычисляю переменную ORACLE_HOME_TMP, а потом банально повторяю то-же самое действие, только без ``
Однако итог вводит меня в тоску
/oracle/product/11.2.0.1
/oracle/product/11.2.0.2

Есть какие мысли?

PS Нижней чакрой чувствую, что беда в комбинации grep "SID_NAME=$DB_NAME)" и ``, но доказать не могу.
А вот тут можно посмотреть картины моей супруги http://sevil.pro

Оффлайн VanDyke

  • Модератор
  • Ветеран
  • *****
  • Сообщений: 1800
  • Рейтинг: 73
  • Пол: Мужской
  • Network Warrior
    • Просмотр профиля
  • Откуда: Destination network unreachable
Re: Парсинг файла (мистика)
« Ответ #1 : 25 августа 2011, 12:06:13 »
Нельзя делать последний перенос строки.
Точнее можно, но не внутри sed, а к примеру перед конвейером.
Not as ultimate as 42, but pretty close...

Оффлайн rjhdby

  • Постоялец
  • ***
  • Сообщений: 432
  • Рейтинг: 3
  • Пол: Мужской
    • rjhdby
    • Просмотр профиля
Re: Парсинг файла (мистика)
« Ответ #2 : 25 августа 2011, 12:11:15 »
  Нельзя делать последний перенос строки.  Точнее можно, но не внутри sed, а к примеру перед конвейером.   
Угу, тоже уже вычислил (чакра ошиблась).
Однако этот приём не работает только внутри ``, в чистом виде всё отрабатывает. Будем искать альтернативы. :]
А вот тут можно посмотреть картины моей супруги http://sevil.pro

Оффлайн newser

  • Начинающий
  • *
  • Сообщений: 27
  • Рейтинг: 3
    • Просмотр профиля
Re: Парсинг файла (мистика)
« Ответ #3 : 25 августа 2011, 12:31:15 »
PS Нижней чакрой чувствую, что беда в комбинации grep "SID_NAME=$DB_NAME)" и ``, но доказать не могу.

Скорее особенности обработки комбинации \<new-line> в случае с обратными кавычками, при которых символ новой строки заменяется пробелом ещё на уровне shell.

Замена конструкции `...` на $(...) решит проблему.
Кому и командная строка - дружественный интерфейс.

Оффлайн rjhdby

  • Постоялец
  • ***
  • Сообщений: 432
  • Рейтинг: 3
  • Пол: Мужской
    • rjhdby
    • Просмотр профиля
Re: Парсинг файла (мистика)
« Ответ #4 : 25 августа 2011, 13:09:57 »
пока так. Громоздко, зато, заодно, решает проблему произвольного расположения тэгов
#!/sbin/sh
L=LISTENER
DB=gbadb
paste -s ./1.txt | tr -d " \t" | sed -e 's/(/#(#/g' -e 's/)/#)#/g' | tr "#" "\n" > ./2.txt
LSR=`grep -n "SID_LIST_$L=" ./2.txt | cut -f"1" -d":"`
COUNT=0
FLAG=0
for I in `tail +$LSR ./2.txt `
do
    [ ".$I" = ".(" ]&&COUNT=`expr $COUNT + 1`
    [ ".$I" = ".)" ]&&COUNT=`expr $COUNT - 1`
    if [ $COUNT -eq 3 ]
    then
        F1=`echo $I | cut -f1 -d"="`
        F2=`echo $I | cut -f2 -d"="`
        [ ".$F1" = ".ORACLE_HOME" ]&&ORACLE_HOME=$F2
        [ ".$F2" = ".$DB" ]&&FLAG=1
    fi
    [ $COUNT -eq 1 -a $FLAG -eq 1 ]&&break
done
echo $ORACLE_HOME
А вот тут можно посмотреть картины моей супруги http://sevil.pro

Оффлайн newser

  • Начинающий
  • *
  • Сообщений: 27
  • Рейтинг: 3
    • Просмотр профиля
Re: Парсинг файла (мистика)
« Ответ #5 : 25 августа 2011, 13:27:57 »
пока так. Громоздко, зато, заодно, решает проблему произвольного расположения тэгов

А $(paste ...) не помогло, что ли?
Кому и командная строка - дружественный интерфейс.

Оффлайн rjhdby

  • Постоялец
  • ***
  • Сообщений: 432
  • Рейтинг: 3
  • Пол: Мужской
    • rjhdby
    • Просмотр профиля
Re: Парсинг файла (мистика)
« Ответ #6 : 25 августа 2011, 13:33:19 »
     А $(paste ...) не помогло, что ли? 
Там другой косяк вылезает. Ну да всё равно,
  зато, заодно, решает проблему произвольного расположения тэгов 
:]
А вот тут можно посмотреть картины моей супруги http://sevil.pro