манипулирование строкой ksh $ # @ !? - PullRequest
0 голосов
/ 26 апреля 2011

Итак, у меня есть этот файл спула с таким типом содержимого.

SQL> select file_name from dev_files;

FILE_NAME
------------------------------------------------------------------
file1.txt
file2.doc
file3.pdf
total.xls

4 rows selected.

SQL> spool off

Я пишу скрипт ksh для загрузки этих файлов на ftp-сервер и обновления файла журнала. и я застрял Вот часть моего плохого кода после многих попыток.

dump="spoolfile.txt"

while read line;
do

if [[`expr match "$line" 'SQL'` !=3]] && [[`expr match "$line" 'FILE_NAME'` !=9]] && [[`expr match "$line" '---------'` !=9]]
then
    ftp -inv $tgt_server <<EOT
    quote user $uname
    quote password $pword
    mput $src_path/$line
    quit
    EOT

    echo "sent $line" >> sent_files.log
fi
done < $dump

как мне убедиться, что "не выбрано ни одной строки" и сказать "выбрано 4 строки". не читаются? может быть любое число вместо 4, соответствующее количеству файлов. В случае отсутствия файлов буферный файл выглядит следующим образом. "." также отсутствует.

SQL> select file_name from dev_files;

no rows selected

SQL> spool off

Ответы [ 2 ]

0 голосов
/ 26 апреля 2011

Вот гораздо более простое решение: вместо того, чтобы пытаться найти строки, которые нужно игнорировать, отметьте строки для обработки:

select concat("JHFDGFSH ",file_name) from dev_files

Теперь все, что вам нужно сделать, - это игнорировать любую строку, которая неначните с JHFDGFSH.

[РЕДАКТИРОВАТЬ] Если вы не можете этого сделать: начните чтение, когда вы нажмете строку, которая всего ----, и остановитесь на первой пустой строке.Это должно сработать, если Oracle не начнет пейджинг.

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

Если это такОК, это не ваша проблема и не ваша вина, когда он ломается и производство останавливается на пару дней;просто покажите проблему и скажите «видите? Вы хотели это так».

Также KSH, вероятно, не тот инструмент;взгляните на awk.Это должно работать:

/^---+/,/^[ \t]*$/ { print; }

Если вы не можете использовать awk, как насчет обработки каждой строки как имени файла и игнорирования тех, которые не существуют?

Пока никто не используетсоздает файл с именем FILE_NAME, 4 rows selected. или SQL> spool off, вы должны найти его, если будете уверены, что правильно указали в кавычках все строки.

0 голосов
/ 26 апреля 2011

Я согласен с большинством комментариев о «отключении заголовков» и т. Д. В SQLPlus,

, но это Easy Peasy; -)

while read line;
do
   case ${line} in 
     -------* ) continue ;;
     FILE_NAME ) continue ;;
     SQL[>] ) continue ;;
     *rows\ selected ) continue ;;
   esac 

   # with enough case match targets, you can probably eliminate
   # the if/fi completely. Good luck.
   if [[`expr match "$line" 'SQL'` !=3]] .....
   ftp ...
   fi
done < $dump

Вам придется поэкспериментироватьс какими значениями поместить в оператор case, чтобы полностью очистить его.

Также обратите внимание, что для любых необычных символов, таких как '>', вероятно, лучше включить их как класс символов [>] (сноватребующий некоторых экспериментов с вашей стороны)

И, наконец, обратите внимание, что если вы хотите включить символы пробела в цели соответствия, либо заключите фразу в dbl-quotes ("), либо экранируйте каждый символ WS как'\'.

...