LinuxForum.Fans
Тема

Shell-процедуры

Автор: Gard 45 сообщений 15921 просмотров 🔒 закрыта
#119748
Gard написал:
Написать shell-процедуру, которая вводит символьную строку; во введённой строке ищет подстроку, передаваемую в качестве первого параметра; вставляет после каждой найденной подстроки символ, передаваемый в качестве второго параметра; удаляет из полученной строки символ, передаваемый в качестве третьего параметра; выводит на экран введённую и новую строку.

[console]$ ./fy1.sh
input line: --a---aca--c--aa--c-
line: '--a---aca--c--aa--c-', find: a, ins: b, del c
--ba---baba----baba---
[/console]

text
#!/bin/sh

function ff() { read -p"input line: " s echo "line: '$s', find: $1, ins: $2, del $3" echo "$s" | sed " s/$1/$2&/g s/$3//g " }

ff "a" "b" "c"

тут всё просто, как в условии.
про sed

#119760

выслал первую порцию, если всё пришло - начну кидать дальше

#119763
Gard написал:
6.
Написать shell-процедуру, которая вводит символьную строку, содержащую маршрутное имя некоторого файла, проверяет введенное маршрутное имя, если оно начинается с символа "/" на совпадение его первой части с маршрутным именем домашнего каталога пользователя.Если введенное маршрутное имя содержит маршрутное имя домашнего каталога или является относительным, то проверяет существование об ошибке, если файл существует то выводит на экран его содержимое,
Если файл не существует то создает и записывает в него строку передаваемую в качестве параметра.

не понял условия.

#119766
Gard написал:
если всё пришло - начну кидать дальше

всё надо сделать? не... мы так не договаривались. что успею, то сделаю. а оплата за сделанное. уже больше одного решения :)

#119770

Если всё сделаешь это будет восхитительно, а так у меня нет права заставлять делать всё, что сделаешь - будет оплачено и спасибо за старания. денюшка за 1ю прогу пришла? если да - кину за всё, что уже сделано, и дальше по ходу выполнения - буду высылать)

#119773

Вообще 6 это вот... но не совсем понятна она =(

text
#!/bin/sh

filename=$1 paramstr=$2 flag=0

read path

echo $path | grep -v '^\/' >/dev/null && { flag=1 } || { expr $path : "^$HOME" >/dev/null && flag=1 }

[ "$flag" -eq 1 ] && { if [ -f "$filename" ] ;then cat $filename | rev else echo $paramstr | rev > $filename fi } || echo "error"

#119784
drBatty написал:
Если введенное маршрутное имя содержит маршрутное имя домашнего каталога или является относительным, то проверяет существование об ошибке,

Пропустили кусочек, когда перепечатывали текст с фотографии.
Там вот так:

Если введённое маршрутное имя содержит маршрутное имя домашнего каталога или является относительным, то проверяет существование указанного файла, в противном случае выводит на экран сообщение об ошибке. Если файл существует, то выводит на экран его содержимое. Если файл не существует, то создаёт его и записывает в него строку, передаваемую в качестве параметра.

#119936

Remka, это что за код? что с ним делать? он явно не в моём стиле... откомментировать?

#119949

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

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

[console]ksu@ksu:~$ ./u0.sh
Users in group 'adm':
root
adm
daemon
FILE_NAME: /dev/audio
PERM: 660, OWNER: root, GROUP: audio
USER 'root'
user - owner. perm = 6
USER 'ksu'
user - in group. perm = 6
USER 'adm'
other user. perm = 0
[/console]

text
#!/bin/sh

function ff() { echo "Users in group '$1':" sed -rn "/^$1:/s/([^:]*:){3}//;T;s/,/\n/gp" /etc/group | tee users.tmp FILE_NAME="$2" echo "FILE_NAME: $FILE_NAME" PERM=`stat --format="%a" "$FILE_NAME" | sed -r 's/.*(...)$/\1/'` OWNER=`stat --format="%U" "$FILE_NAME"` GROUP=`stat --format="%G" "$FILE_NAME"` echo "PERM: $PERM, OWNER: $OWNER, GROUP: $GROUP" while [ -n "$3" ] do USER="$3" echo "USER '$USER'" if [ "$USER" = "$OWNER" ]; then echo "user - owner. perm = ${PERM:0:1}" else GR=`sed -rn "s/^$GROUP:.*$USER[^:]*$/&/p" /etc/group` if [ -n "$GR" ]; then echo "user - in group. perm = ${PERM:1:1}" else echo "other user. perm = ${PERM:2:1}" fi fi shift done }

ff "adm" "/dev/audio" "root" "ksu" "adm"

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

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

#120671
Gard написал:
13.
Написать shell-процедуру, кторая, всем пользователям, работающим в данный момент в системе, имена которых задаются третьим и последующими параметрами, рассылает сообщения из файла, имя которого передается вторым параметром; повторяет сообщения с периодичностью, задаваемой первым параметром; прекращает выдачу сообщений при вводе слова quit.
text
#!/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 используется. там имена юзеров, которым надо слать мессаги.

#120679
Gard написал:
14.
Написать shell-процедуру, которая всем пользователям, не включеннным в заданную первым параметром группу, посылает по почте сообщения о текущем времени и дате; всем пользователям, включенным в заданную первым параметром группу, посылает по почте сообщения Happy New Year!
text
#!/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"

#120680

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

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

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

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

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

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

#120694

ясненько)))

#120717

10.
написать shell-процедуру,которая проверяет почтовый ящик на наличие в нем сообщений, находит в почтовом ящике одинаковые по тексту сообщения, всем пользователям, приславшим более одного сообщения с одинаковым текстом, рассылает по почте сообщения, текст которого содержится в файле, имя которого передается в качестве параметра.
text
#!/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"

#120723

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

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

#120897

примечания:

из этого поста: http://linuxforum.ru/viewtopic.php?pid=135091#p135091

text
sed -n '
    1{
        ${
            /^$/{
                s/.*/no sub/p
                q
            }
        }
    }
    $=' tmp.x

этот скрипт считает строчки, и пишет, сколько строк в файле tmp.x. Используется команда =, которая в sed выводит номер строки. Но написано не просто =, а $=, что приводит к тому, что выводится номер только последней строки (номер последней строки равен числу строк). На самом деле, можно было-бы написать wc -l, что-бы посчитать, сколько-же было замен (каждая замена порождает строчку в файле tmp.x), вот только здесь есть и исключение:

text
1{ # если строчка первая
    ${ # и если строчка последняя (т.е. строчка единственная в файле)
        /^$/{ # и если сразу после начала строки идёт её конец (т.е. единственная строка, да и та пустая)
            s/.*/no sub/p # эта строчка меняется на "no sub" (замен не было), и выводится на экран
            q # на этом скрипт прерывается
        }
    }
}
Войдите или зарегистрируйтесь, чтобы ответить.