LINUX.ORG.RU
ФорумAdmin

[отредактировано] Скрипт обработки текста в shell работает медлено, нужно улучшение алгоритма


0

0

Скрипт обработки текста в shell работает медлено, нужно улучшение алгоритма

Добрый день,

Подскажите, как написать быстрый shell-скрипт. Задача такая:
Имеется log файл, например:

------------- cut -----------------
LST_START Starting BAT_R001
AP_TDS - Tds OCT 20080416 1 032353 not found in tds_get_flag
LST_START Starting TIT_E001
LST_START Starting TIT_E002
LST_START Starting SER_R001
LST_START Starting TGE_R001
Internal error: no page 4
Internal error: no page 4
Internal error: no page 4
Internal error: no page 4
LST_START Starting FRX_R002
LST_START Starting BAT_R001
AP_TDS - Tds OCT 20080416 1 032353 not found in tds_get_flag
LST_START Starting FRX_R001
LST_START Starting FRX_V002
LST_START Starting BAT_R001
AP_TDS - Tds OCT 20080416 1 032353 not found in tds_get_flag
LST_START Starting FRX_V001
LST_START Starting BAT_R001
-------------- cut -----------------

Нужно вывести этот лог в таком виде:
-------------- cut -----------------
LST_START Starting BAT_R001: AP_TDS - Tds OCT 20080416 1 032353 not found in tds_get_flag
LST_START Starting TGE_R001: Internal error: no page 4
LST_START Starting BAT_R001: AP_TDS - Tds OCT 20080416 1 032353 not found in tds_get_flag
LST_START Starting BAT_R001: AP_TDS - Tds OCT 20080416 1 032353 not found in tds_get_flag
-------------- cut -----------------

т.е. вывести сам заголовок "LST_START Starting TGE_R001:" и рядом ошибку "Internal error: no page 4". Где нет ошибок просто игнорировать. Сам скрипт я написал, проблем нет, но когда таких строк около 8-10 тыс, то скрипт работает о-о-очень долго! Может у кого-то есть другое решение? Вот сам скрипт:

#!/bin/ksh
cat "$*" | while read LINE
do
t=`echo "$LINE" | grep "err" # для примера оставил err, а так файл с ошибками
r=`echo "$LINE" | grep "LST_START Starting"`
if [ -n "$r" ]; then
bt="$r"
fi
if [ -n "$t" ]; then
echo "$bt: $t" > ap_with_name_proc.txt
fi
:
done

cat ap_with_name_proc.txt | uniq > ap_with_name_proc_uniq.txt
echo "done."
exit 0

anonymous

Средствами shell, скорость такой и останется. Тут нужен инструмент специализирующийся на обработке больших текстов...

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

>Средствами shell, скорость такой и останется

Спорим, нет. Если убрать 4 fork-а (`|`) и 2 exec-а (grep) на каждую строку, очень даже ускорится.

DonkeyHot ★★★★★
()

Как вариант:

cat FILE.LOG | \
uniq | \
grep -v '^LST_START' -B1 | \
grep -vF -- '--' | \
sed 'N; s/\n/: /'

spirit ★★★★★
()

а обязательно на shell делать? может лучше на питоне/перде ?

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

Согласен. Ускорится, если это всё убрать. Но как это сделать?

Только используя, xargs, awk, perl и т.д. О чём я, собственно, и сказал. Работать с текстом тем, что для этого предназначено. :)

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

Постыдились бы, с таким то логином...;)
cat "$@" |\
while read line
do
 case "$line" in
  LST_START*)
   prefix="$line"
   ;;
  *)
   echo "$prefix: $line"
  ;;
 esac
done | uniq

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