LINUX.ORG.RU

Оптимизация работы скрипта ( работа с .gz архивами на лету)

 , ,


0

1

Добрый день! Подскажите пожалуйста варианты оптимизации данного скрипта

arch_list=«a.gz b.gz c.gz» # может быть от одного до 30 архивов размером около 50 мб каждый. Внутри архива логи.Архивы имеют доступ readonly.

var1=`gunzip -c $arch_list | wc -l`; echo -e «result1: $var1\n»;

var2=`gunzip -c $arch_list | grep -v word1 | grep -v word2 | grep -v word3 | grep -v word4 | wc -l`; echo -e «result2: $var2\n »;

var3=`gunzip -c $arch_list| grep word2 | wc -l`; echo -e «result3: $var3\n»;

var4=`gunzip -c $arch_list| grep word3 | wc -l`; echo -e «result4: $var4\n»;

var5=`gunzip -c $arch_list| grep word4 | wc -l`; echo -e «result5: $var5\n»;

var6=`gunzip -c $arch_list| grep word3 | cut -f9 -d ' ' |sort | uniq -u | wc -l`; echo -e «result6: $var6\n»;

Соответственно скрипт выполняется слишком долго из-за того что каждый раз идет gunzip -c $arch_list.

Впрочем оптимизация — написать скрипт так чтобы читать файл(ы) только один раз и все проверки/манипуляции делать сразу

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

У меня /dev/shm 2Гб. А результат zcat $arch_list может весить и 5Гб и больше...

zdravnik
() автор топика

Попробуй использовать avfs

anonymous
()
zcat $arch_list | awk '
        {var1++}
!(/word1/ && /word2/ && /word3/ && /word4/) {var2++}
/word1/ {var3++}
/word2/ {var4++}
/word3/ {var5++}
/word4/ {var6++}
END {print "result1: ",$var1"
     print "result2: ",$var2"
     print "result3: ",$var3"
     print "result4: ",$var4"
     print "result5: ",$var5"
     print "result6: ",$var6"
'
anonymous
()
Ответ на: комментарий от anonymous

var6 не дочитал, copy/paste — но смысл, надеюсь ясен и cut/sort/uniq легко реализуемы в awk или perl/python/tcl/...

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

и $ не нужен в print'e — устал видимо, пора домой.

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

Не очень понял, если честно.

Во-первых, зачем в принте запятая стоит перед $ Во-вторых, что это за var используется в awk, ты же их нигде не определял? В-третьих, для понимания твоего варианта начал с простого: zcat a.gz b.gz c.gz | awk '/pattern/' {var++} Хотел чтобы вывести кол-во строк содержащих pattern, но в ответ получил cannot open file `{var++}' for reading (Нет такого файла или каталога).

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

направление я тебе задал. не можешь сам, жди лохов, которые за тебя все сделают или башляй в Jobs

anonymous
()
#!/bin/bash

  arch_list="a.gz b.gz c.gz"

  job1 () { printf 'result1: %s\n' $( wc -l ) ; } # job1

  job2 () {
    printf 'result2: %s\n' $( grep -E -v \
                                '(word1|word2|word3|word4)' | wc -l )
  } # job2

  job3 () { printf 'result3: %s\n' $( grep word2 | wc -l ) ; } # job3

  job4 () { printf 'result4: %s\n' $( grep word3 | wc -l ) ; } # job4

  job5 () { printf 'result5: %s\n' $( grep word4 | wc -l ) ; } # job5

  job6 () { printf 'result3: %s\n' $( grep word3 |
                                      cut -f 9 -d ' ' |
                                      sort | uniq -u  | wc -l )
  } # job6

  gunzip -c $arch_list |
  tee >( job1 ) >( job2 ) >( job3 ) >( job4 ) >( job5 ) >( job6 ) >/dev/null |
  sort

exit


Естественно, только для bash.

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

направление я тебе задал. не можешь сам, жди лохов, которые за тебя все сделают или башляй в Jobs

Когда хотят задать направление то пишут что-то вроде «попробуй через awk». ТЫ же привел конкретную схему в которой опечатался и которая не работает, по которой я задал уточняющий вопрос а ты слился. Так что сам иди... и жди...

ABW, через функции, отличный вариант! Спасибо за идею!

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

я писал на ходу, а туп настолько что даже мелкие опечатки не осилил исправить, куда тебе самому awk осваивать. клянчь дальше по форумам, побирушка.

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

Вариант с awk по нормальному выглядит вот так:

zcat $arch_list | awk '
        {var1++}
!(/word1/ || /word2/ || /word3/ || /word4/) {var2++}
/word1/ {var3++}
/word2/ {var4++}
/word3/ {var5++}
/word4/ {var6++}
END {
     print "result1: "  var1
     print "result2: "  var2
     print "result3: "  var3
     print "result4: "  var4
     print "result5: "  var5
     print "result6: "  var6
     }'

Так что опечаток у советчика было будь здоров. А что касается момента с sort и uniq, то на awk это не так и просто решить, поэтому видимо советчик и «не дочитал» В любом случае спасибо анонимусу за идею. И огромный минус за манеру общения, видимо одичал совсем...

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