удаление всех вкладок в sqlplus

Я могу решить эту проблему, но я не понимаю, почему это происходит.

Моя задача: (в ksh)

  • 1-й шаг: запрос числа из базы данных с sqlplus,
  • 2-й шаг: отформатируйте текст для почты,
  • 3-й шаг: отправьте письмо с ними.

Это часть моего кода:

psnr() { sqlplus -s USR/PASS@PROD << EOS SET PAGESIZE 0 SET COLSEP ";" SET FEEDBACK OFF SET TRIMOUT ON SET TRIMSPOOL ON select max_number-last_number from postalslip where state = 'OPEN' / exit / EOS } 

Я получил номер, 1234567, когда я вызываю эту функцию.

 PSNR=$(psnr) 

Я пишу слово для письма:

 echo "Today's result is: $PSNR" > $MAILTMP 

если я хочу использовать эту переменную MAILTMP, я должен использовать tr -d '\040\011' что я нашел здесь, в stackexchange, потому что результат без tr будет следующим:

 od -c mailtmp.17872.txt 0000000 T oday ' sresulti 0000020 s : \t 1 2 3 4 5 0000040 6 7 \n 0000043 

Эта вкладка «\ t» – это то, что я не понимаю: откуда она взялась, из sqlplus? Возможно, специфичность БД? (Я проверил TOAD, оба coloumns – число (18). Может быть, функция в ksh имеет некоторые особенности?

2 Solutions collect form web for “удаление всех вкладок в sqlplus”

Я также сталкивался с этим нежелательным пробелом при работе с другой базой данных. Очевидно, что сценарии оболочки и инструменты, такие как SQLPlus, являются неправильной вещью для извлечения данных из баз данных, но есть случаи, когда это удобно.

Мое решение состоит в том, чтобы вырезать ведущее и завершающее пробелы из результата:

 psnr() { sqlplus -s USR/PASS@PROD << 'EOS' | sed -e $'s/^[ \t]*//' -e $'s/[ \t]*$//' SET PAGESIZE 0 SET COLSEP ";" SET FEEDBACK OFF SET TRIMOUT ON SET TRIMSPOOL ON select max_number-last_number from postalslip where state = 'OPEN' / exit / EOS } 

Если ksh не поддерживает синтаксис строки $'...' , достаточно просто заменить:

 # Original style sed $'s/^[ \t]*//' # Alternative style T=$(printf "\t") ... sed "s/^[ $T]*//" 

Альтернативное быстрое и грязное исправление – использовать оболочку для удаления нежелательных пробелов. Оставляя вашу psnr() неизменной, вместо этого:

 echo "Today's result is: $PSNR" > $MAILTMP 

вы должны написать это:

 echo "Today's result is:" $PSNR > $MAILTMP 
 sqlplus <<'EOF' | perl -pe 's/\t//g' Some queries here EOF 

Это предоставляется в виде пробела. Мои запросы sqlplus выводят только space и в формате csv, поэтому я использую это для удаления нежелательного пространства

 echo 'foo bar ,baz ,foobar ' | perl -pe 's/ +,/,/g ; s/ +$//g' foo bar,baz,foobar 
  • Как заставить оператор SQL отображать, сколько строк оно подсчитало до сих пор?
  • Как установить и запустить python и базу данных через busybox
  • Отличный способ SQL-запроса нескольких CSV-файлов?
  • vim: Синтаксис синтаксиса с помощью аргумента командной строки
  • Передача переменных оболочки в оператор SQL
  • SQLPLUS с циклами сценариев оболочки
  • Как я могу получить SQL-запросы для отображения в выходном файле?
  • Получить определенную строку ниже строки grepped
  • Как запускать несколько запросов в скрипте KSH
  • Добавление разрывов между каждыми двумя словами в bash
  • Использовать аргумент командной строки и переменную с помощью sed Inside Bash Script
  • Linux и Unix - лучшая ОС в мире.