URL: https://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 5656
[ Назад ]

Исходное сообщение
"Нужны 2 скрипта для FreeBSD"

Отправлено leha , 22-Авг-06 12:06 
Если у кого есть в наличии и кому не жалко, не могли бы вы выложить здесь два скрипта.
1. (Попроще) Подсчитывает в файле количество слов "add"
2. (Сложнее) Архивирует файл "App.log" в /var/log/App.N.bz2 где N - порядковый номер равный числу запуска скрипта

Заранее благодарен!


Содержание

Сообщения в этом обсуждении
"Нужны 2 скрипта для FreeBSD"
Отправлено sclif13 , 22-Авг-06 12:15 
Perl вам поможет, товарищь!!!



"Нужны 2 скрипта для FreeBSD"
Отправлено Dif , 22-Авг-06 18:32 
>Если у кого есть в наличии и кому не жалко, не могли
>бы вы выложить здесь два скрипта.
>1. (Попроще) Подсчитывает в файле количество слов "add"
>2. (Сложнее) Архивирует файл "App.log" в /var/log/App.N.bz2 где N - порядковый номер
>равный числу запуска скрипта
>
>Заранее благодарен!


1. подсчитывает количество вхождений последовательности символов "add"
#!/usr/bin/bash
cat < FILE_NAME | grep -o "add" | grep -c "add"

2. Если имеется ввиду за текущую сессию... то

#!/usr/bin/bash
if [ ! NUM_BZIP ]
then
  export NUM_BZIP=1
else
  NUM_BZIP=`expr $NUM_BZIP + 1`
fi
bzip2 -k App.log
mv App.bz2 /var/log/App.NUM_BZIP.bz2

если за все время... то
#!/usr/bin/bash
if [ ! -f /var/log/NUM_BZIP ]
then
  echo 1 > /var/log/NUM_BZIP
esle
  NUM_BZIP=$( cat /var/log/NUM_BZIP )
  NUM_BZIP=`expr NUM_BZIP + 1`
  echo $NUM_BZIP >> /var/log/NUM_BZIP
fi
bzip2 -k App.log
mv App.bz2 /var/log/App.NUM_BZIP.bz2

Удачи!


"Нужны 2 скрипта для FreeBSD"
Отправлено Dif , 22-Авг-06 18:34 
>  NUM_BZIP=$( cat /var/log/NUM_BZIP )
>  NUM_BZIP=`expr NUM_BZIP + 1`
>  echo $NUM_BZIP >> /var/log/NUM_BZIP

тут забыл подставить $
  NUM_BZIP=`expr $NUM_BZIP + 1`



"Нужны 2 скрипта для FreeBSD"
Отправлено regunkov , 22-Авг-06 19:46 
>>Если у кого есть в наличии и кому не жалко, не могли
>>бы вы выложить здесь два скрипта.
>>1. (Попроще) Подсчитывает в файле количество слов "add"
>>2. (Сложнее) Архивирует файл "App.log" в /var/log/App.N.bz2 где N - порядковый номер
>>равный числу запуска скрипта
>>
>>Заранее благодарен!
>
>
>1. подсчитывает количество вхождений последовательности символов "add"
>#!/usr/bin/bash
>cat < FILE_NAME | grep -o "add" | grep -c "add"

Если Ваш grep не знает опцию -o
ну и всё-таки '\<слово\>' ищем (опции -w в POSIX тоже нет)
man sed | sed -n -e 's/\<sed\>/\n&\n/gp' | grep -c -e '^\<sed\>$'


"Нужны 2 скрипта для FreeBSD"
Отправлено leha , 22-Авг-06 21:47 

>Если Ваш grep не знает опцию -o

не знает

>ну и всё-таки '\<слово\>' ищем (опции -w в POSIX тоже нет)
>man sed | sed -n -e 's/\<sed\>/\n&\n/gp' | grep -c -e '^\<sed\>$'

выдает 0 (ноль)



"Нужны 2 скрипта для FreeBSD"
Отправлено Dif , 23-Авг-06 10:40 
>>Если Ваш grep не знает опцию -o
>
>не знает

ну так поставь тот, который знает.


"Нужны 2 скрипта для FreeBSD"
Отправлено regunkov , 23-Авг-06 11:02 
>
>>Если Ваш grep не знает опцию -o
>
>не знает
>
>>ну и всё-таки '\<слово\>' ищем (опции -w в POSIX тоже нет)
>>man sed | sed -n -e 's/\<sed\>/\n&\n/gp' | grep -c -e '^\<sed\>$'
>
>выдает 0 (ноль)

Может мана нет, или слова sed в нем нет :)

$ echo -e "l1\tsed;sed;\nl2 notsed;\nsed" | sed -n -e 's/\<sed\>/\n&\n/gp' | grep -c -e '^\<sed\>$'
3

$ echo -e "l1\tsed;sed;\nl2 notsed;\nsed"
l1      sed;sed;
l2 notsed;
sed

$ echo -e "l1\tsed;sed;\nl2 notsed;\nsed" | sed -n -e 's/\<sed\>/\n&\n/gp'
l1
sed
;
sed
;

sed

здесь без '-c' для наглядности
$ echo -e "l1\tsed;sed;\nl2 notsed;\nsed" | sed -n -e 's/\<sed\>/\n&\n/gp' | grep -e '^\<sed\>$'
sed
sed
sed

А у Вас не так?


"Нужны 2 скрипта для FreeBSD"
Отправлено leha , 23-Авг-06 12:29 

>
>Может мана нет, или слова sed в нем нет :)
>

есть и то и другое :)

>$ echo -e "l1\tsed;sed;\nl2 notsed;\nsed" | sed -n -e 's/\<sed\>/\n&\n/gp' | grep -c -e '^\<sed\>$'

выдает 0


>$ echo -e "l1\tsed;sed;\nl2 notsed;\nsed"
>l1      sed;sed;
>l2 notsed;
>sed

да, это есть

>$ echo -e "l1\tsed;sed;\nl2 notsed;\nsed" | sed -n -e 's/\<sed\>/\n&\n/gp'

это ничего не выдает

>здесь без '-c' для наглядности
>$ echo -e "l1\tsed;sed;\nl2 notsed;\nsed" | sed -n -e 's/\<sed\>/\n&\n/gp' | grep -e '^\<sed\>$'

и это ничего не выдает

>А у Вас не так?

Как видите. Для справки: версия FreeBSD 4.11



"Нужны 2 скрипта для FreeBSD"
Отправлено regunkov , 23-Авг-06 12:44 
>
>>
>>Может мана нет, или слова sed в нем нет :)
>>
>
>есть и то и другое :)
>
>>$ echo -e "l1\tsed;sed;\nl2 notsed;\nsed" | sed -n -e 's/\<sed\>/\n&\n/gp' | grep -c -e '^\<sed\>$'
>
>выдает 0
>
>
>>$ echo -e "l1\tsed;sed;\nl2 notsed;\nsed"
>>l1      sed;sed;
>>l2 notsed;
>>sed
>
>да, это есть
>

Тогда пробуем так
$ echo -e "l1\tsed;sed;\nl2 notsed;\nsed" | sed -e 's/\<sed\>/\n&\n/g'


"Нужны 2 скрипта для FreeBSD"
Отправлено leha , 23-Авг-06 12:48 
>
>Тогда пробуем так
>$ echo -e "l1\tsed;sed;\nl2 notsed;\nsed" | sed -e 's/\<sed\>/\n&\n/g'
l1      sed;sed;
l2 notsed;
sed



"Нужны 2 скрипта для FreeBSD"
Отправлено regunkov , 23-Авг-06 13:46 
>>
>>Тогда пробуем так
>>$ echo -e "l1\tsed;sed;\nl2 notsed;\nsed" | sed -e 's/\<sed\>/\n&\n/g'
>l1      sed;sed;
>l2 notsed;
>sed

Есть два особых случая(!) выражений в квадратных скобках: выражение `[[:<:]]' и `[[:>:]]' соответствует пустой строке в начале и конце слова соответственно. Слово определяется как последовательность символов, входящих в это слово, и отсутствие символов до и после этой последовательности. Словесные символы входят в класс символов alnum (это определяется в wctype(3)), куда входит еще и подчеркивание. Это совместимое, но не описываемое в POSIX 1003.2 дополнение, поэтому оно используется в программах, предназначенных для переноса на другие платформы (с соответствующим предупреждением).

Может это подойдет, у меня не работает
$ echo -e "l1\tsed;sed;\nl2 notsed;\nsed" | sed -e 's/[[:<:]]sed[[:>:]]/\n&\n/g'


"Нужны 2 скрипта для FreeBSD"
Отправлено leha , 23-Авг-06 14:04 

>Может это подойдет, у меня не работает
>$ echo -e "l1\tsed;sed;\nl2 notsed;\nsed" | sed -e 's/[[:<:]]sed[[:>:]]/\n&\n/g'

не работает :(



"Нужны 2 скрипта для FreeBSD"
Отправлено regunkov , 23-Авг-06 14:49 
>
>>Может это подойдет, у меня не работает
>>$ echo -e "l1\tsed;sed;\nl2 notsed;\nsed" | sed -e 's/[[:<:]]sed[[:>:]]/\n&\n/g'
>
>не работает :(

Короче читаем это. Насколько я понимаю сколь либо простой замены якорям \< и \> найти не удастся.

Matching words with \< and \>
Searching for a word isn't quite as simple as it at first appears. The string "the" will match the word "other." You can put spaces before and after the letters and use this regular expression: " the ." However, this does not match words at the beginning or end of the line. And it does not match the case where there is a punctuation mark after the word.

There is an easy solution. The characters "\<" and "\>" are similar to the "^" and "$" anchors, as they don't occupy a position of a character. They do "anchor" the expression between to only match if it is on a word boundary. The pattern to search for the word "the" would be "\<[tT]he\>." The character before the "t" must be either a new line character, or anything except a letter, number, or underscore. The character after the "e" must also be a character other than a number, letter, or underscore or it could be the end of line character.


Одно из наипростейших решений:

You can compensate by using the alternation mechanism. Matching the word "the" in the beginning, middle, end of a sentence, or end of a line can be done with the extended regular expression:

    (^| )the([^a-z]|$)

There are two choices before the word, a space or the beginining of a line. After the word, there must be something besides a lower case letter or else the end of the line.


"Нужны 2 скрипта для FreeBSD"
Отправлено leha , 23-Авг-06 13:30 

>если за все время... то
>#!/usr/bin/bash
>if [ ! -f /var/log/NUM_BZIP ]
> then
>  echo 1 > /var/log/NUM_BZIP

добавить export NUM_BZIP=1

> esle
>  NUM_BZIP=$( cat /var/log/NUM_BZIP )
>  NUM_BZIP=`expr NUM_BZIP + 1`

здесь, как уже сказано пропущен $ (NUM_BZIP=`expr $NUM_BZIP + 1`)

>  echo $NUM_BZIP >> /var/log/NUM_BZIP
>fi
>bzip2 -k App.log
>mv App.bz2 /var/log/App.NUM_BZIP.bz2

и здесь тоже mv App.bz2 /var/log/App.$NUM_BZIP.bz2

>
>Удачи!

Спасибо!



"Нужны 2 скрипта для FreeBSD"
Отправлено Dif , 23-Авг-06 18:32 
>добавить export NUM_BZIP=1

а завем во втором варианте экспорт?
мы записываем кол-во вызовов в файл. а не в переменную...


>и здесь тоже mv App.bz2 /var/log/App.$NUM_BZIP.bz2

угук.. вечер был.. тупняк ))


"Нужны 2 скрипта для FreeBSD"
Отправлено leha , 24-Авг-06 11:04 
>>добавить export NUM_BZIP=1
>
>а завем во втором варианте экспорт?
>мы записываем кол-во вызовов в файл. а не в переменную...
>

Я конечно не силен в скриптах, но вроде бы без этого NUM_BZIP не инициализируется при первом запуске.


"Нужны 2 скрипта для FreeBSD"
Отправлено Dif , 24-Авг-06 11:46 
>Я конечно не силен в скриптах, но вроде бы без этого NUM_BZIP
>не инициализируется при первом запуске.


if [ ! -f /var/log/NUM_BZIP ] #если не существует файла NUM_BZIP в директории /var/log/
then
  echo 1 > /var/log/NUM_BZIP #тогда создаем этот файл и записываем туда 1
esle
  NUM_BZIP=$( cat /var/log/NUM_BZIP ) #если такой файл существуетЮ тогда считываем цифру, что там лежит
  NUM_BZIP=`expr NUM_BZIP + 1` #увеличиваем это значение на единицу
  echo $NUM_BZIP > /var/log/NUM_BZIP #перезаписываем в этот файл новое значение
fi

З.Ы. пока коментировал нашел ошибку )))
в строке echo $NUM_BZIP > /var/log/NUM_BZIP должен стоять только один символ ">"
это означает, что файл будет переписан.
">>" - означает, что текст будет дописан в конец файла.


"Нужны 2 скрипта для FreeBSD"
Отправлено leha , 24-Авг-06 11:53 
Если if здесь работает также как С++, то в ветку между else и fi мы не попадаем в первом запуске. В этом случае NUM_BZIP не проинициализирован. Так?

"Нужны 2 скрипта для FreeBSD"
Отправлено Dif , 24-Авг-06 13:06 
>Если if здесь работает также как С++, то в ветку между else
>и fi мы не попадаем в первом запуске. В этом случае
>NUM_BZIP не проинициализирован. Так?


не так. смотри условие и думай.