31

Remka пишет:

Вдруг ты бы разобрался с условием задачи и написал бы свой?)))

что это за задача? мне проще с нуля писать...

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

32

Gard пишет:

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 используется. там имена юзеров, которым надо слать мессаги.

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

33

Gard пишет:

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"
Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

34

очень часто мелькает имя ksu это рандомное или что то значит?)))

35

Gard пишет:

10.
написать shell-процедуру,которая проверяет почтовый ящик на наличие в нем сообщений, находит в почтовом ящике одинаковые по тексту сообщения, всем пользователям, приславшим более одного сообщения с одинаковым текстом, рассылает по почте сообщения, текст которого содержится в файле, имя которого передается в качестве параметра.

фига се! это целое исследование...

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

36

Remka пишет:

очень часто мелькает имя ksu это рандомное или что то значит?)))

это имя юзера от которого я сейчас работаю.

PS: а ещё это имя здешнего компьютера. короче я сейчас ksu@ksu. просто это не мой компьютер ab

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

37

ясненько)))

38

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"
Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

39

к 10у примеру наверное нужны пояснения:

1) сначала я составил список всех файлов  msgs.lst в почтовом ящике $MAILDIR
2) потом я пропарсил все файлы, выдрав оттуда "ОТ КОГО" (From), и саму мессагу. Последнюю я не сохранил, а только вычислил из неё CRC32.
3) CRC и FROM я записал в файл crcs.txt
4) после этого я отсортировал этот файл, и удалил все строки, кроме тех, которые повторяются (sort | uniq d)
5)получившийся список содержит только сообщение с одинаковым автором и crc. Всем им я отправил по сообщению (иным несколько раз, тем, кто прислал мне например 2 одинаковых поста + ещё 2 других одинаковых).

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

40

примечания:

из этого поста: 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 # на этом скрипт прерывается
        }
    }
}
Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

41

вот в этом посте 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


Инверсия порядка символов в строке.

Этот скрипт меняет последовательность символов в строке на противоположную, например

 Консоль:
$ echo "ABCDEFGHJ" | ./reverseline.sed
JHGFEDCBA

Пример 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

да, код слегка изменён, ибо идею я помнил, а читать свой-же перевод мне было лениво bx

ЗЫЖ у меня тут ошибочка - я не сбросил флаг перехода (а в info sed всё правильно). только это не страшно - в первый раз переход выполняется ВСЕГДА. потому если у нас например менять нечего (реверс строки "Z"), то программа пытается осуществить реверс ДВА раза, хотя достаточно одного. но это не страшно. оба раза команда s НЕ выполняется. bx

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

42

примечание к посту http://linuxforum.ru/viewtopic.php?pid=136055#p136055

sed -rn "/^$1:/s/([^:]*:){3}//;T;s/,/\n/gp" /etc/group | tee users.tmp

лихо закрученный однострок, неправда-ли?  ae

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.
(казалось-бы, причём тут чай? bx )

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

43

отсюда: http://linuxforum.ru/viewtopic.php?pid=136125#p136125

drBatty пишет:

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, то лучше вешайтесь. Если виндовс-админ - убейтесь ап сервер.

Остальные могут читать дальше:  ag

наша цель - найти одинаковую почту от одинаковых авторов. причём почты РЕАЛЬНО МНОГО, потому представляется бредом сравнивать каждое сообщение с каждым (для этого потребуется N*N сравнений, и для одного из моих почтовых ящиков N (число постов) равно 1610. столько ждать мы устанем, даже если перепишем код на Си). Решение простое - нужно свернуть каждый пост в одну строчку, и записать эти строчки в файл.

Первым делом выдёргиваем мыло автора поста, например вот этого:

From: <admin@drbatty.ru>

Видно, что строка начинается на From:, после которого идут несколько пробелов, потом ещё что-то но не < (в  этом примере этого нет), потом идёт <, потом нужный нам адрес в котором нет пробелов и >, а потом идёт >, и ещё что-то. Запишем выделенное короче, регуляркой: ^From:\s+[^<]*<([^> ]+)>.*

нам достаточно только первого адреса (некоторые письма содержат 2 адреса), для чего и стоит T;p;q

Содержимым письма считается все строчки начиная с Content-Type:, и до последней строки. Т.е. /^Content-Type:\s+/,$.

Его я пересылаю в команду cksum, которая вычисляет CRC32, и его печатает. Правда она ещё мусор в виде имени файла печатает (прочерк в данном случае), потому понадобилась ещё одна sed для фильтрации мусора.

вот и всё. Дальше можно сортировать строчки и удалить все не повторяющиеся:

 Консоль:
sort | uniq -d

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

44

ПОМОГИТЕ ПОЖАЛУЙСТА!!!!!!!!!!!!!!!!
ОЧЕНЬ НАДО!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

написать shell процедуру которая:
выводит на экран список всех пользователей системы включенных в заданную первым параметром группу пользователей
для каждого из заданных третьим и следующими параметрами имен пользователей выводит на экран права доступа к заданному вторым параметром файлу

45

http://linuxforum.ru/viewtopic.php?id=18294
ветка закрыта.

95% процентов проблем находятся между клавиатурой и стулом.