Смысл такой, есть файл где пишутся данные типа:
10.10.0.2 1025 255.255.255.255 1947 17 3 204 1252074605
10.10.0.2 1025 10.10.0.7 1947 17 3 204 1252074609
10.10.0.2 1025 255.255.255.255 1947 17 4 272 1252074720
10.10.0.2 1025 10.10.0.7 1947 17 3 204 1252074724
10.10.0.2 2284 10.10.0.1 3128 6 3 144 1252074802
10.10.0.1 3128 10.10.0.2 2284 6 3 120 1252074802
Необходимо обработать каждую строку, для получения отдельных подстрок, с последующим переносом в БД postgresql.
Представляю рабочий скрипт обработки текстового файла:# BASH Shell Script
cat $1 | while read s
do
echo $s
str_num=0
old_str_num=0
string_length=${#s}
while [ $str_num -lt $string_length ]
do
if [ -z ${s:str_num:1} ]
then
str_length=`expr $str_num - $old_str_num`
echo ${s:old_str_num:str_length}
old_str_num=$str_num
fi
str_num=`expr $str_num + 1`
done
str_length=`expr $str_num - $old_str_num`
echo ${s:old_str_num:str_length}
done
echo "ok"Получившийся скрип работает правильно, но как всегда есть но, он очень медленно обрабатывает строки, что будет очень существенно, т.к. планируется обрабатывать большое количество строк.
Может есть у кого нибудь идеи как возможно оптимизировать данный скрипт, для увеличения процесса обработки текстового файла.
В Shell новичок, так что сильно не пинайте ;-)
Заранее очень благодарен за помощь и содействие ...
один из вариантов оптимизации вашего скрипта, но этот вариант не печатает пустые строки, так что может быть не подойдёт
---
sed "s/ \+/\n/g" $1
echo "ok"
---
>один из вариантов оптимизации вашего скрипта, но этот вариант не печатает пустые
>строки, так что может быть не подойдёт
>---
>sed "s/ \+/\n/g" $1
>echo "ok"
>---что-то вот лично я не пойму, а что он конкретно делает?
$1 - подразумевается аргумент при запуске скрипта, тобишь название файла на обработку надо думать?
далее s/ \+/\n/g есть замена всех пробелов с плюсами (вы же заэкранировали тут плюс, поэтому это не означает от 1 до беск. пробелов) на перевод строки..
тобишь он задуман, как раскладыватель каждой строчки в столбик чтоли? но, поскольку + заэкранирован, работать не будет, т.к. там нет пробелов с плюсом
так чтоли?
если я правильно понял вы ПОСИМВОЛЬНО разбираете строки с интерпретаторе - что уже само просто дебильное решение, даже хуже.
разобрать подобный текст (фикс кол-во колонок) с одновременным формирование sql запроса типа insert можно тулзой awk в одну строку.
а это случаем не netflow?
>если я правильно понял вы ПОСИМВОЛЬНО разбираете строки с интерпретаторе - что
>уже само просто дебильное решение, даже хуже.
>разобрать подобный текст (фикс кол-во колонок) с одновременным формирование sql запроса типа
>insert можно тулзой awk в одну строку.
>а это случаем не netflow?Нет, это не netflow, а ng_ipacct.
Смысл данного скрипта задуман таким образом, чтобы получить строку в виде отдельных переменных, с возможность записи последних в SQL базу PostgreSQL.
Так же подразумеваю что это возможно реализовать без использования выгрузки данных из ng_ipacct сразу же в SQL базу, но в связи с отсутствием знаний по Shell решил реализовать данный алгоритм таким способом.
>[оверквотинг удален]
>>а это случаем не netflow?
>
>Нет, это не netflow, а ng_ipacct.
>
>Смысл данного скрипта задуман таким образом, чтобы получить строку в виде отдельных
>переменных, с возможность записи последних в SQL базу PostgreSQL.
>
>Так же подразумеваю что это возможно реализовать без использования выгрузки данных из
>ng_ipacct сразу же в SQL базу, но в связи с отсутствием
>знаний по Shell решил реализовать данный алгоритм таким способом.ты хоть маленько представляешь что делаешь??? похоже что ты даже не представляешь - либо задумайся либо меняй работу.
еще раз - разбор текста статистики ПОСИМВОЛЬНО ИНТЕРПРЕТАТОРМ есть тупость неимоверная.
уж если нужно перевести стороку вида
number1 number2 number3 ... numberN
в строку вида
number3 number5 number7
или
INSERT TO SOME_BASE.SOME_BASE VALUES (number3, number5, number7);
то надо быть полным ламером чтобы додуматься до подобного решения
еще раз для особо грамотных и умеющих читать ответа на свои дебильные посты
man awk, блин
Во первых про то кому менять работу или нет, я думаю не тебе решать, так что держи язык за зубами. А на счет того какого рода тупость данной идеи я не спрашивал, а попросил помощи разобраться, т.к. с Shell на данный момент знаком всего в течении уже как 8 часов.
А вот на счет ламерства я думаю ты глубоко погорячился, т.к. я представляю тебя с твоими то знаниями после 8 часов чтения о Shell скриптах грамотный ты наш со своими не дебильными постами.
>[оверквотинг удален]
>done
>echo "ok"
>
>Получившийся скрип работает правильно, но как всегда есть но, он очень медленно
>обрабатывает строки, что будет очень существенно, т.к. планируется обрабатывать большое количество
>строк.
>Может есть у кого нибудь идеи как возможно оптимизировать данный скрипт, для
>увеличения процесса обработки текстового файла.
>В Shell новичок, так что сильно не пинайте ;-)
>Заранее очень благодарен за помощь и содействие ...да уж...
sed/awk -- но главное -- что должно получиться? как должны выглядеть результирующие строки?
в скрипте разбираться влом.
>если я правильно понял вы ПОСИМВОЛЬНО разбираете строки с интерпретаторе - что
>уже само просто дебильное решение, даже хуже.
>разобрать подобный текст (фикс кол-во колонок) с одновременным формирование sql запроса типа
>insert можно тулзой awk в одну строку.
>а это случаем не netflow?Нет, это не netflow, а ng_ipacct.
Смысл данного скрипта задуман таким образом, чтобы получить строку в виде отдельных переменных, с возможность записи последних в SQL базу PostgreSQL.
Так же подразумеваю что это возможно реализовать без использования выгрузки данных из ng_ipacct сразу же в SQL базу, но в связи с отсутствием знаний по Shell решил реализовать данный алгоритм таким способом.
Забыть про шелл скрипт
Он не подходит для обработки большого количества текстаPerl или что-то другое
Всем огромное спасибо за подсказки. Данную проблемму разрешил, и как говорилось в самых первых постах решается все одной строкой:
cat $1 | awk '{print "INSERT INTO internet_trafik VALUES(\047"$1"\047,\047"$3"\047,\047"$5"\047,\047"$2"\047,\047"$4"\047,\047"$6"\047,\047"$7"\047,\047"$8"\047);"}' | /usr/local/bin/psql -U pgsql -d ng_ipacctИнтересен следующий момент, если реализовать данную выгрузку посредством PERL обработка будет гораздо быстрее? Или прироста не сильно будет заметно? Или же как всегда будет все зависеть от количества строк?
На всякий случай количество строк предполагается порядка 15000 ...
>Всем огромное спасибо за подсказки. Данную проблемму разрешил, и как говорилось в
>самых первых постах решается все одной строкой:
>cat $1 | awk ...cat $1 здесь совершенно лишний так как awk умеет сам читать из файла
awk '{...}' $1 будет делать тоже самое>
>Интересен следующий момент, если реализовать данную выгрузку посредством PERL обработка будет гораздо
>быстрее? Или прироста не сильно будет заметно? Или же как всегда
>будет все зависеть от количества строк?
>
>На всякий случай количество строк предполагается порядка 15000 ...врядли будет быстрее, но если вам интересно то попробуйте - это тоже одна строка на perl.
и если попробуете, то отпишите сюда, пожалуйста.я сравнил ваш оригинальный скрипт на том примере что приведён вначале
real 0m0.945s
user 0m0.242s
sys 0m0.712sи однострочник на sed
real 0m0.001s
user 0m0.000s
sys 0m0.001s
>[оверквотинг удален]
>
>я сравнил ваш оригинальный скрипт на том примере что приведён вначале
>real 0m0.945s
>user 0m0.242s
>sys 0m0.712s
>
>и однострочник на sed
>real 0m0.001s
>user 0m0.000s
>sys 0m0.001sЕсли не затруднит, могли бы Вы выложить сюда реализацию данной проблеммы на sed?
>Если не затруднит, могли бы Вы выложить сюда реализацию данной проблеммы на
>sed?так вот же он во втором коментарии лежит :-)
он не кладёт данные в БД он просто разбирает строку, так же как и ваш оригинальный скрипт.
>один из вариантов оптимизации вашего скрипта, но этот вариант не печатает пустые
>строки, так что может быть не подойдёт
>---
>sed "s/ \+/\n/g" $1
>echo "ok"
>---что-то вот лично я не пойму, а что он конкретно делает?
$1 - подразумевается аргумент при запуске скрипта, тобишь название файла на обработку надо думать?
далее s/ \+/\n/g есть замена всех пробелов с плюсами (вы же заэкранировали тут плюс, поэтому это не означает от 1 до беск. пробелов) на перевод строки..
тобишь он задуман, как раскладыватель каждой строчки в столбик чтоли? но, поскольку + заэкранирован, работать не будет, т.к. там нет пробелов с плюсом
так чтоли?P.S. кстати, там в качестве разделителя походу табы вообще