Какой командой shell можно в цикле получать по одной строке из файла для выполнения над каждой из них каких-либо действий?
Алгоритм:
- Получаем строку n
- действия над ней
- запись результата
- следующая строка
Или лучше на Перле сделать? Что будет быстрее отрабатывать?
>Какой командой shell можно в цикле получать по одной строке из файла
>для выполнения над каждой из них каких-либо действий?
>Алгоритм:
>- Получаем строку n
>- действия над ней
>- запись результата
>- следующая строка
>Или лучше на Перле сделать? Что будет быстрее отрабатывать?
for + cat
#! /bin/sh/tmp/file
cat file | while read n
do
echo "$n" >> /tmp/file2
done
Хочу сделать скрипт - анализатор эффективности правил для assassina, но не соображу как организовать счетчик.
Смысл скрипта такой: есть файл со списком названий правил (которые попадают в хидер) и список писем, попавших в спам с пометками в хидере, какие правила сработали для этого письма. Я беру поочереди названия правил и проверяю их наличие в теле писем, встретилось - щелкнул счетчик. Но как счетчик прикрутить уже не соображу:
count=""; #счетчик, пока нулевой
SPISOK1=""; # набор слов для поиска
SPISOK2=""; # список файлов, где нужно искать эти словаfile1="/home/test/test_rul"; # откуда берем имена правил
file2="/home/test/test_spam_list"; #откуда берем файлы писемwhile [ 1 ]
do
read SPISOK1 || break # начинаем читать список имен правил пока не закончится файл
while [ 2 ]
do
read SPISOK2 || break #получаем имена писем пока не закончится файл
cat /home/test/spam/$SPISOK2 | awk '$0~/$SPISOK1/' # ищем название правил в теле каждого письма
--=< КАК ПРИКРУТИТЬ СЧЕТЧИК? >=--
done < $file2
echo $SPISOK1 " = "$count >> /home/test/itogi # после поиска выводим результат
done < $file1
>Хочу сделать скрипт - анализатор эффективности правил для assassina, но не соображу
>как организовать счетчик.
>Смысл скрипта такой: есть файл со списком названий правил (которые попадают в
>хидер) и список писем, попавших в спам с пометками в хидере,
>какие правила сработали для этого письма. Я беру поочереди названия правил
>и проверяю их наличие в теле писем, встретилось - щелкнул счетчик.
>Но как счетчик прикрутить уже не соображу:
>count=""; #счетчик, пока нулевой
>
>
>SPISOK1=""; # набор слов для поиска
>SPISOK2=""; # список файлов, где нужно искать эти слова
>
>file1="/home/test/test_rul"; # откуда берем имена правил
>file2="/home/test/test_spam_list"; #откуда берем файлы писем
count=0>while [ 1 ]
>do
>read SPISOK1 || break # начинаем читать список имен правил пока не
>закончится файл
> while [ 2 ]
> do
> read SPISOK2 || break #получаем имена писем пока
>не закончится файл
if cat /home/test/spam/$SPISOK2 | awk '$0~/$SPISOK1/'; then
let count="$count+1"
fi> done < $file2
> echo $SPISOK1 " = "$count >> /home/test/itogi # после поиска выводим результат
>done < $file1попробуйте так
P.S чтобы построчно считывать файл, необязательно писать таких конструкций типа
while [ 1 ], достаточно написать:while read SPISOK2; do
.....
done<$file2
>Хочу сделать скрипт - анализатор эффективности правил для assassina, но не соображу
>как организовать счетчик.
>Смысл скрипта такой: есть файл со списком названий правил (которые попадают в
>хидер) и список писем, попавших в спам с пометками в хидере,
>какие правила сработали для этого письма. Я беру поочереди названия правил
>и проверяю их наличие в теле писем, встретилось - щелкнул счетчик.
>Но как счетчик прикрутить уже не соображу:
>count=""; #счетчик, пока нулевой
>
>
>SPISOK1=""; # набор слов для поиска
>SPISOK2=""; # список файлов, где нужно искать эти слова
>
>file1="/home/test/test_rul"; # откуда берем имена правил
>file2="/home/test/test_spam_list"; #откуда берем файлы писем
>
>while [ 1 ]
>do
>read SPISOK1 || break # начинаем читать список имен правил пока не
>закончится файл
> while [ 2 ]
> do
> read SPISOK2 || break #получаем имена писем пока
>не закончится файл
> cat /home/test/spam/$SPISOK2 | awk '$0~/$SPISOK1/' # ищем название
>правил в теле каждого письма
> --=< КАК ПРИКРУТИТЬ СЧЕТЧИК? >=--
> done < $file2
> echo $SPISOK1 " = "$count >> /home/test/itogi # после поиска выводим результат
>done < $file1В принципе, ответ уже дан, если вам нужно получать список всех правил, но не каждого правила конкретно. Если нужно каждое правило конкретно, это будет выглядеть примерно так (сразу оговорочка, я не знаю сколько там у вас правил, и пишу для пары-тройки, вы перепишите там уж как вам будет удобно с помощью массива правил):
--------------------------------------------
# counter.awk
# using: counter.awk filename.in > filename.out
#!/usr/bin/awk -fBEGIN {passed=0; unauthorized=0; hehe=0;}
{
{
if ($0 ~ /PASSED/) passed+=1}
{
if ($0 ~ /UNAUTHORIZED/) unauthorized+=1
}
{
if ($0 ~ /HEHE/) hehe+=1
}
}
END {
print "Passed: "passed"\nUnauthorized: "unauthorized"\nHehe: "hehe}
-----------------------------------------------
Это для одного файла, для многих файлов:
counter.awk /dir/name/* , будет счетчик всех файлов в директории /dir/name/.
спасибо, всё считает :) Можно пользоваться вместе с русскими правилами для ассассина - http://www.opennet.me/openforum/vsluhforumID1/69857.html
не получается :(
совсем забыл про то, что надо сбрасывать счетчик и он плюсует новое значение к предыдущему. Но это фиг с ним - можно переделать, не получается нормально считать. он первое значение считает, а для каждого следующего прибавляет его же. Т.е если первое будет 17, то второе - 34, третье 41, четвертое 58 .....