Вдруг ты бы разобрался с условием задачи и написал бы свой?)))
что это за задача? мне проще с нуля писать...
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)
Настоятельно просим вас при общении соблюдать Правила форума и законы РФ. Наша тематика вне политики, поэтому воздержитесь от обсуждения ситуации на Украине и связанных с ней событий, независимо от того, какую сторону вы поддерживаете.
Также напоминаем, что наш форум находится в доменной зоне .ru, физически расположен на российских серверах и мы соблюдаем действующее законодательство России. Любые сообщения о политике будут удаляться.
Linux Forum → Программирование → Shell-процедуры
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Вдруг ты бы разобрался с условием задачи и написал бы свой?)))
что это за задача? мне проще с нуля писать...
13.
Написать shell-процедуру, кторая, всем пользователям, работающим в данный момент в системе, имена которых задаются третьим и последующими параметрами, рассылает сообщения из файла, имя которого передается вторым параметром; повторяет сообщения с периодичностью, задаваемой первым параметром; прекращает выдачу сообщений при вводе слова quit.
#!/bin/bash
function ff()
{
echo "users:"
who | tee users.tmp
PAUSE="$1"
MSG="$2"
COUNT=0
declare -a USERS
while [ -n "$3" ]
do
USERS[$COUNT]="$3"
shift
echo "USER $COUNT '${USERS[$COUNT]}'"
(( COUNT = COUNT + 1 ))
done
STR=""
while [ "$STR" != "quit" ]
do
COUNT=0
while [ -n "${USERS[$COUNT]}" ]
do
USER=${USERS[$COUNT]}
if grep -q -E "^$USER" users.tmp; then
TTY=`sed -rn "s/^$USER\s+(\S+).*/\1/;T;p;q" users.tmp`
echo "send mesage for $USER ($TTY)"
cat "$MSG" | write "$USER" "$TTY"
fi
(( COUNT = COUNT + 1 ))
done
read -t$PAUSE -p"Input quit if exit($PAUSE sec): " STR
echo
done
}
ff "2" "msg.txt" "root" "ksu"а тут у нас массив USERS используется. там имена юзеров, которым надо слать мессаги.
14.
Написать shell-процедуру, которая всем пользователям, не включеннным в заданную первым параметром группу, посылает по почте сообщения о текущем времени и дате; всем пользователям, включенным в заданную первым параметром группу, посылает по почте сообщения Happy New Year!
#!/bin/bash
function ff()
{
HOST="ksu"
GROUP="$1"
while read STR
do
USER=`echo "$STR" | sed -r 's/:.*//'`
echo "for user '$USER'"
GR=`sed -n "s/^$GROUP:.*$USER[^:]*/&/p" /etc/group`
if [ -n "$GR" ]; then
echo "user $USER in group $GROUP"
echo "Happy New Year!" | mail -s"subj" $USER@$HOST
else
echo "user $USER whithout $GROUP"
date | mail -s"curent date" $USER@$HOST
fi
done < /etc/passwd
}
ff "adm"очень часто мелькает имя ksu это рандомное или что то значит?)))
10.
написать shell-процедуру,которая проверяет почтовый ящик на наличие в нем сообщений, находит в почтовом ящике одинаковые по тексту сообщения, всем пользователям, приславшим более одного сообщения с одинаковым текстом, рассылает по почте сообщения, текст которого содержится в файле, имя которого передается в качестве параметра.
фига се! это целое исследование...
очень часто мелькает имя ksu это рандомное или что то значит?)))
это имя юзера от которого я сейчас работаю.
PS: а ещё это имя здешнего компьютера. короче я сейчас ksu@ksu. просто это не мой компьютер 
ясненько)))
10.
написать shell-процедуру,которая проверяет почтовый ящик на наличие в нем сообщений, находит в почтовом ящике одинаковые по тексту сообщения, всем пользователям, приславшим более одного сообщения с одинаковым текстом, рассылает по почте сообщения, текст которого содержится в файле, имя которого передается в качестве параметра.
#!/bin/sh
function ff()
{
MAILDIR="./cur"
find $MAILDIR -type f >msgs.lst
if [ -s crcs.txt ]; then
rm -v crcs.txt
fi
while read FILE_NAME
do
echo "scaning message '$FILE_NAME'"
FROM=`sed -rn 's/^From:\s+[^<]*<([^> ]+)>.*/\1/;T;p;q' "$FILE_NAME"`
CRC=`sed -rn '/^Content-Type:\s+/,$p' "$FILE_NAME" | cksum | sed 's/ .*//'`
if [ -z "$FROM" ] || [ -z "$CRC" ]; then
continue
fi
echo "FROM: '$FROM', CRC='$CRC'"
echo "$CRC $FROM" >>crcs.txt
done <msgs.lst
sort crcs.txt | uniq -d | tee dbl.txt
while read CRC MAIL
do
echo "send message for $MAIL"
# cat "$1" | mail -s"Subj" "$MAIL"
done < dbl.txt
}
ff "msg.txt"к 10у примеру наверное нужны пояснения:
1) сначала я составил список всех файлов msgs.lst в почтовом ящике $MAILDIR
2) потом я пропарсил все файлы, выдрав оттуда "ОТ КОГО" (From), и саму мессагу. Последнюю я не сохранил, а только вычислил из неё CRC32.
3) CRC и FROM я записал в файл crcs.txt
4) после этого я отсортировал этот файл, и удалил все строки, кроме тех, которые повторяются (sort | uniq d)
5)получившийся список содержит только сообщение с одинаковым автором и crc. Всем им я отправил по сообщению (иным несколько раз, тем, кто прислал мне например 2 одинаковых поста + ещё 2 других одинаковых).
примечания:
из этого поста: http://linuxforum.ru/viewtopic.php?pid=135091#p135091
sed -n '
1{
${
/^$/{
s/.*/no sub/p
q
}
}
}
$=' tmp.xэтот скрипт считает строчки, и пишет, сколько строк в файле tmp.x. Используется команда =, которая в sed выводит номер строки. Но написано не просто =, а $=, что приводит к тому, что выводится номер только последней строки (номер последней строки равен числу строк). На самом деле, можно было-бы написать wc -l, что-бы посчитать, сколько-же было замен (каждая замена порождает строчку в файле tmp.x), вот только здесь есть и исключение:
1{ # если строчка первая
${ # и если строчка последняя (т.е. строчка единственная в файле)
/^$/{ # и если сразу после начала строки идёт её конец (т.е. единственная строка, да и та пустая)
s/.*/no sub/p # эта строчка меняется на "no sub" (замен не было), и выводится на экран
q # на этом скрипт прерывается
}
}
}вот в этом посте http://linuxforum.ru/viewtopic.php?pid=135080#p135080 применён страшный код:
sed -rn '
s/.*/\n&\n/
:l
s/\n(.)(.*)(.)\n/\3\n\2\n\1/
t l
s/\n//g
p'его не я придумал, а прочитал о нём в info sed. вот по-русски: http://drbatty.ru/sed/ch07.html
Инверсия порядка символов в строке.
Этот скрипт меняет последовательность символов в строке на противоположную, например
Пример 7.6.
#!/usr/bin/sed -rf
# если в строку нет 2х символов (иначе, длинна строки меньше двух),
# то ничего не делаем
/../! b
# Реверс строки
# сначала в начало и в конец строки добавляются символы \n.
s/^.*$/\
&\
/
# Обмен первого и последнего символа местами, символы меняются
# вместе с маркёрами \n, причём относительный порядок символа и маркёра
# не меняется. Поэтому маркёры оказываются "внутри" - например:
# \n F .* E \n --- до замены
# E \n .* \n F --- после
# Цикл продолжается пока внутри не останется 1 или 0 символов.
tx
:x
s/(\n.)(.*)(.\n)/\3\2\1/
tx
# Удаление маркёров.
s/\n//gда, код слегка изменён, ибо идею я помнил, а читать свой-же перевод мне было лениво 
ЗЫЖ у меня тут ошибочка - я не сбросил флаг перехода (а в info sed всё правильно). только это не страшно - в первый раз переход выполняется ВСЕГДА. потому если у нас например менять нечего (реверс строки "Z"), то программа пытается осуществить реверс ДВА раза, хотя достаточно одного. но это не страшно. оба раза команда s НЕ выполняется. 
примечание к посту http://linuxforum.ru/viewtopic.php?pid=136055#p136055
sed -rn "/^$1:/s/([^:]*:){3}//;T;s/,/\n/gp" /etc/group | tee users.tmpлихо закрученный однострок, неправда-ли?
sed -rn "
/^$1:/s/([^:]*:){3}//
T
s/,/\n/gp
" /etc/group | tee users.tmpЗдесь я пропарсил файл /etc/group. Тут мы видим мою любимую sed, но не всё так просто: я всегда заключаю sed-скрипт 'в одиночные кавычки', когда он внутри shell-скрипта. Кроме исключительных случаев. Тут как раз такой случай, это не просто shell-скрипт, а shell-функция, причём с параметром. Этот параметр называется $1 и имеет значение adm. При этом сам скрипт заключён в "двойные кавычки", что приводит к замене $1 на adm (это делает shell). Потому на самом деле sed получает такой скрипт:
sed -rn "
/^adm:/s/([^:]*:){3}//
T
s/,/\n/gp
" /etc/group | tee users.tmpпервая строчка /^adm:/s/([^:]*:){3}// имеет адресное выражение /^adm:/, и потому действует лишь на строки, которые начинаются на adm:, а именно на эту:
adm:x:4:root,adm,daemon
команда s/([^:]*:){3}// удаляет {три} последовательности (в скобках). Последовательности [^:]*:, что по-русски значит: любые символы кроме двоеточия в любом количестве, за которыми идёт двоеточие. Т.е. удаляется
adm:x:4:
И остаётся
root,adm,daemon
Это список пользователей, которые входят в группу adm, через запятую. Если мы нашли ненужную строчку, то командой T мы переходим к анализу следующей, нужная строчка обрабатывается далее - все запятые меняются на перевод строки, и у нас получается три строки:
root
adm
daemon
т.е. список нужных юзеров. Этот список выводится и на экран, и в файл users.tmp командой tee.
(казалось-бы, причём тут чай?
)
отсюда: http://linuxforum.ru/viewtopic.php?pid=136125#p136125
FROM=`sed -rn 's/^From:\s+[^<]*<([^> ]+)>.*/\1/;T;p;q' "$FILE_NAME"`
CRC=`sed -rn '/^Content-Type:\s+/,$p' "$FILE_NAME" | cksum | sed 's/ .*//'`
Страшно? Если вы - пользователь windows, то лучше вешайтесь. Если виндовс-админ - убейтесь ап сервер.
Остальные могут читать дальше:
наша цель - найти одинаковую почту от одинаковых авторов. причём почты РЕАЛЬНО МНОГО, потому представляется бредом сравнивать каждое сообщение с каждым (для этого потребуется N*N сравнений, и для одного из моих почтовых ящиков N (число постов) равно 1610. столько ждать мы устанем, даже если перепишем код на Си). Решение простое - нужно свернуть каждый пост в одну строчку, и записать эти строчки в файл.
Первым делом выдёргиваем мыло автора поста, например вот этого:
From: <admin@drbatty.ru>Видно, что строка начинается на From:, после которого идут несколько пробелов, потом ещё что-то но не < (в этом примере этого нет), потом идёт <, потом нужный нам адрес в котором нет пробелов и >, а потом идёт >, и ещё что-то. Запишем выделенное короче, регуляркой: ^From:\s+[^<]*<([^> ]+)>.*
нам достаточно только первого адреса (некоторые письма содержат 2 адреса), для чего и стоит T;p;q
Содержимым письма считается все строчки начиная с Content-Type:, и до последней строки. Т.е. /^Content-Type:\s+/,$.
Его я пересылаю в команду cksum, которая вычисляет CRC32, и его печатает. Правда она ещё мусор в виде имени файла печатает (прочерк в данном случае), потому понадобилась ещё одна sed для фильтрации мусора.
вот и всё. Дальше можно сортировать строчки и удалить все не повторяющиеся:
ПОМОГИТЕ ПОЖАЛУЙСТА!!!!!!!!!!!!!!!!
ОЧЕНЬ НАДО!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
написать shell процедуру которая:
выводит на экран список всех пользователей системы включенных в заданную первым параметром группу пользователей
для каждого из заданных третьим и следующими параметрами имен пользователей выводит на экран права доступа к заданному вторым параметром файлу
http://linuxforum.ru/viewtopic.php?id=18294
ветка закрыта.
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Linux Forum → Программирование → Shell-процедуры
Форум работает на PunBB, при поддержке Informer Technologies, Inc