LINUX.ORG.RU

Оптимизировать скрипт


0

0

Доброго времени суток.

Имеется скрипт, который обрабатывает файл update.ver, баз обновлений ESET NOD,
и выбирает из него нужные арх итектуры и поддержку нужных языков антивируса
на загрузку, вот его часть:

LANG=«Czech\|Slovak»
PLATFORM=«x64\|winnt64\|64bit»

let «num=$(cat update.ver | wc -l)-10» && tail -n $num update.ver | while read string
do
if echo $string | grep '\[' > /dev/null
then
if ! [ str = " ]
then
   if echo $str | grep -iv «$LANG\|$PLATFORM» > /dev/null
   then
    echo -e $str >> update1.ver       
   fi
fi
str=$string
fi
if ! echo $string | grep '\[' > /dev/null
then
str=$str"\\n"$string
fi

На этом участке происходит наиболшая нагрузка на процессор и наибольшее время задержки.
Посоветуйте как можно оптимизировать и как правильно переписать,
так как уверен что написано коряво.

Вот пример файла:

[eav_WINNT32_1033]
display_name=ESET NOD32 Antivirus (English, 32bit)
language=1033
platform=winnt32
type=eav
category=component
version=3.0.695.0
buildMS=196608
buildLS=45547520
date=19.01.2010
file=/download/win/v3eav/eav_nt32_enu.nup
size=6741884
[eavbe_WINNT32_1033]
display_name=ESET NOD32 Antivirus BUSINESS EDITION (English, 32bit)
language=1033
platform=winnt32
type=eavbe
category=component
version=3.0.695.0
buildMS=196608
buildLS=45547520
date=19.01.2010
file=/download/win/v3eav/eavbe_nt32_enu.nup
size=6742928
[eav_WINNT64_1033]
display_name=ESET NOD32 Antivirus (English, 64bit)
language=1033
platform=winnt64
type=eav
category=component
version=3.0.695.0
buildMS=196608
buildLS=45547520
date=19.01.2010
file=/download/win/v3eav/eav_nt64_enu.nup
size=8016252

★★★★★

Так сходу — переписать строки с echo и grep с использованием встроенных регулярных выражений bash (если он доступен, конечно). А лучшее решение — переписать на более быстром языке (например, perl).

GotF ★★★★★
()
Ответ на: комментарий от GotF

Вроде же grep и sed как раз реализует регуляпные выражения в bash с тем функционалом, который мне нужен, или есть еще какой-либо способ? Иначе только на perl ?

kostik87 ★★★★★
() автор топика
Ответ на: комментарий от kostik87

>>Вроде же grep и sed как раз реализует регуляпные выражения в bash с тем функционалом, который мне нужен, или есть еще какой-либо способ?

man bash, секция SHELL GRAMMAR, глава Compound Commands, начиная с бинарного оператора =~. Это должно быть быстрее, по идее.

Иначе только на perl ?


На чём умеешь, на том и пиши (-:

GotF ★★★★★
()

Как уже сказали, man bash. То есть можно использовать if [[ ]] (двойные квадратные скобки) и оказаться от grep.

Ещё в баше можно делать if else fi.

Ещё tail умеет отсчитывать строки он начала файла, то есть (wc -l) - 10 можно заменить на tail -n +11.

А если заменять bash на другой язык, ИМХО, для этой задачи лучше AWK.

mky ★★★★★
()

ну хотя бы для начала закрыть бесконечный цикл while read .

wild_tux
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.