Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Виділення рядків за значенням у стовпці
але в деяких випадках (якщо важко сформулювати специфікації_визначальні_позицію) може виявитися зручніше застосувати штучне приймання: записати шукане_значення в окремий файл і виконати його з'єднання з вихідним файлом: # запис шуканого_значення в тимчасовий файл echo " шукане_значення " >$HOME/tempfile # сортування вихідного файлу по необхідному стовпцю sort + позиція-1 - позиція -t' разделитель ' файл | # з'єднання: 1-й файл - результат попередньої команди, у ньому # для з'єднання береться необхідний стовпець, 2-й файл - тимчасовий # файл, у ньому - стовпець перший і єдиний join -j1 позиція -j2 1 -t' разделитель ' - $HOME/tempfileПриклад 1 Завдання Формат застосування цієї команди повинен бути: команда користувач...Нижче ми приводимо текст скрипта (ми назвали його ex7_1) з докладними коментарями. #!/bin/bash2 # ============================================================== # # Скрипт ex7_1: відправлення повідомлення/листа заданим користувачам # # ============================================================== # # Коментар!/bin/bash2 описує місцезнаходження командного # інтерпретатора shell. Він допомагає системі знайти інтерпретатор, # а також допомагає команді file визначити тип файла-скрипта. # У більшості випадків він не є обов'язковим, але є # "правилом гарного тону" у програмуванні. # ======================================================= # # Текст повідомлення/листа заноситься у файл temp01 # Зверніть увагу: тимчасовий файл розміщається в домашньому # каталозі користувача. echo Це тестове повідомлення > $HOME/temp01 echo для перевірки зв'язку зі скрипта. >>$HOME/temp01 echo Бажаю успіху! >>$HOME/temp01 echo ap10999 >>$HOME/temp01 # ======================================================== # Параметри команди являють собою список імен користувачів. # Наступним оператором організує цикл, який виконується до # тих пор, поки залишаються неопрацьовані параметри. while [ $# -ne 0 ] do # ====================================================== # Значення 1-го параметра привласнюється змінної us us=$1 # ====================================================== # Віддаляється файл temp02. Зверніть увагу: діагностика команди # rm пригнічується (направляється в "системну корину"). Ця діагностика # може повідомляти про те, що файлу, що віддаляється, не існує - # вона нам не потрібна. rm $HOME/temp02 2>/dev/null # ====================================================== # Спроба видачі повідомлення користувачеві. # Системне введення команди write направляється на файл temp01. # Якщо не вдається встановити з'єднання з користувачем (користувача # немає в системі або він заблокував свій термінал) команда write # виводить діагностичне повідомлення (ми його пригнічуємо) і # повертає false. if write $us <$HOME/temp01 2>/dev/null then # ==================================================== # Якщо повідомлення пройшло - OK! виводимо на свій термінал # повідомлення про цей, і - "обробка користувача" закінчена. echo "Користувачеві $us відправлене повідомлення" else # ==================================================== # Якщо повідомлення не пройшло - спроба відправлення листа # Системне введення команди mail направляється на файл temp01. # Команда mail завжди повертає true. Вона тільки запускає # дочірній процес sendmail, і, якщо відправлення листа не вдалося, # це буде з'ясовано тільки в дочірньому процесі, яка видасть # діагностику, цю діагностику перенаправляємо в тимчасовий # файл temp02. mail $us <$HOME/temp01 >$HOME/temp02 # ==================================================== # Очікуємо 1 сек, щоб дочірній процес встигнув записати # у файл temp02 повідомлення про те, що лист не відправлений sleep 1 # ==================================================== # Перевіряємо, чи їсти що-небудь у файлі temp02 if test -s $HOME/temp02 then # ================================================== # Якщо файл temp02 не порожній - користувач не знайдений echo "Користувач $us не знайдений" # ================================================== # у цьому випадку лист попадає у файл dead.letter, # який нам не потрібний rm $HOME/dead.letter 2>/dev/null else # ================================================== # Якщо файл temp02 порожній - лист відправлений echo "Користувачеві $us відправлений лист" # ==================================================== # Кінець умови if test -s $HOME/temp02 fi # ====================================================== # Кінець умови if write $us... fi # ====================================================== # Зрушення списку параметрів shift # ======================================================== # Кінець циклу while done # ======================================================== # Після виходу із циклу # Віддаляються тимчасові файли rm $HOME/dead.letter 2>/dev/null rm $HOME/temp01 2>/dev/null rm $HOME/temp02 2>/dev/null # ======== Кінець скрипта ex7_1 ================================= #Нижче наведений зразок виконання створеної команди:
Приклад 2 Завдання Формат застосування цієї команди повинен бути: команда каталог...Cкрипт названий ex7_2, його текст із докладними коментарями приводиться нижче. #!/bin/bash2 # ============================================================== # # Скрипт ex7_2: пошук співпадаючих перших рядків # # ============================================================== # # ======================================================== # Запам'ятовуємо поточний каталог mydir=`pwd` # ======================================================== # Параметри команди являють собою список каталогів. # Наступним оператором організує цикл, який виконується до # тих пор, поки залишаються неопрацьовані параметри. while [ $# -ne 0 ] do # ====================================================== # Перехід у каталог, що задається 1-м параметром; # діагностика направляється в тимчасовий файл cd $1 2>$HOME/temp01 # ====================================================== # Перевірка - не чи порожній файл із діагностикою if test -s $HOME/temp01 then # ==================================================== # Якщо є діагностика - каталог недоступний echo "Каталог $1 недоступний/не існує" # ==================================================== # Перехід до наступного параметра shift # ==================================================== # Пропуск залишку тіла циклу continue fi # ====================================================== # Ми ввійшли в заданий каталог echo "Каталог: $1" # ====================================================== # Вибираються файли розміром більше 0, # список файлів направляється в потік find -size +0c -type f | # ====================================================== # Файли в списку виведені із вказівкою каталогу./, # від цих символів потрібно позбутися; # результат записується в тимчасовий файл sed 's/.\///' >$HOME/temp01 # ====================================================== # Цикл поки у файлі temp01 щось залишається while test -s $HOME/temp01 do # ==================================================== # Вибирається в змінну $f1 перший рядок з # тимчасового файлу - ім'я чергового файлу f1=`head -n1 $HOME/temp01` # ==================================================== # Вибирається в змінну $s1 перший рядок з # обраного файлу s1=`head -n1 $f1` # ==================================================== # $n - ознака того, що збіг рядків не знайдений # $m - номер другого файлу зі списку n="no"; m=2; # ==================================================== # Нескінченний цикл - вихід по break while [ 1 ] do # ================================================== # Вибирається $ m-я рядок зі списку файлів - ім'я файлу f2=`sed -n ''$m'p' $HOME/temp01` # ================================================== # Якщо обраний порожній рядок - список файлів закінчився if [ "$f2" = "" ]; then # ================================================ # у цьому випадку - вихід із циклу break # ================================================ # Кінець умови if [ "$f2" = "" ] fi # ================================================== # Вибирається 1-я рядок із цього файлу s2=`head -n1 $f2` # ================================================== # Рядок рівняється із запомненной раніше рядком з 1-го # файлу в списку if [ "$s1" = "$s2" ]; then # ================================================ # Перевірка - чи були вже збігу if [ "$n" = "no" ]; then # ============================================== # Якщо збігів не було - виводиться ім'я 1-го файлу зі списку echo -n "$f1 "; n="yes" # ============================================== # Кінець умови if [ "$n" = "no" ] fi # ================================================ # Виводиться ім'я файлу, у якому знайдений збіг echo -n "$f2 " # ================================================ # Файлу, у якому знайдений збіг, віддаляється з файлу-списку sed ''$m'd' $HOME/temp01 > $HOME/temp02 cat $HOME/temp02 >$HOME/temp01 # ================================================ # Кінець дій при збігу else # ================================================ # Якщо немає збігу - перехід до наступного файлу зі списку m=`expr $m + 1` # ================================================ # Кінець дій при відсутності збігу fi # ================================================== # Кінець циклу перебору інших файлів списку done # ==================================================== # Якщо були знайдені збіги - виводиться текст загального рядка if [ "$n" = "yes" ]; then echo "- $s1" fi # ==================================================== # Видалення 1-й рядка зі списку імен файлів sed '1d' $HOME/temp01 > $HOME/temp02 cat $HOME/temp02 >$HOME/temp01 # ==================================================== # Кінець циклу перебору імен файлів done # ====================================================== # Перехід до наступного параметра shift # ====================================================== # Кінець списку перебору параметрів done # ======================================================== # Видалення тимчасового файлу rm $HOME/temp* # ======================================================== # Повернення у вихідний каталог cd "$mydir" # ======== Кінець скрипта ex7_2 ================================= #Зразок виконання створеної команди:
Приклад 3 Завдання Формат застосування: команда місяць код_товару...Місяць задається у форматі: MON-YY, наприклад: JAN-90, JUN-89, NOV-17 і т.п. Cкрипт названий ex7_3, його текст із докладними коментарями приводиться нижче. #!/bin/bash2 # ============================================================== # # Скрипт ex7_3: вибірка обсягу продажів заданого товару # # ============================================================== # # Вибирається 1-й параметр і список параметрів зрушується mon=$1; shift # ======================================================= # Місяць записується у файл echo "$mon" >$HOME/temp01 # ======================================================= # Інші параметри команди являють собою список кодів товарів. # Цикл, який виконується доти, поки залишаються # неопрацьовані параметри. while [ $# -ne 0 ] do # ===================================================== # Код товару запам'ятовується в змінній і записується у файл code=$1 echo "$code" >$HOME/temp02 # ===================================================== # КОНВЕЄР 1 # ===================================================== # У файлі query5 віддаляються зайві пробіли sed -n 's/ */ /gp' /home/metod/query5 | # ===================================================== # Вибираються стовпці: код замовлення, код товару, кількість cut -f2,3,5 -d' ' | # ===================================================== # Сортування по коду товару sort +1 -2 -t' ' | # ===================================================== # З'єднання з файлом - кодом товару join -j1 2 -j2 1 -t' ' - $HOME/temp02 | # ===================================================== # Вибираються стовпці: код замовлення, кількість # (код товару більше не потрібний) cut -f2,3 -d' ' | # ===================================================== # Сортування по коду замовлення й збереження у файлі sort +0 -1 -t' ' >$HOME/temp03 # # ===================================================== # КОНВЕЄР 2 # ===================================================== # У файлі query4 віддаляються зайві пробіли sed -n 's/ */ /gp' /home/metod/query4 | # ===================================================== # Вибираються стовпці: код замовлення, дата cut -f1,4 -d' ' | # ===================================================== # Сортування по коду замовлення sort +0 -1 -t' ' | # ===================================================== # З'єднання з файлом - місяцем sed -n '/'$mon'/p' | # ===================================================== # Вибирається стовпець коду замовлення # (дата більше не потрібна) cut -f1 -d' ' | # ===================================================== # Сортування по коду sort +0 -1 -t' ' | # ===================================================== # З'єднання з файлом замовлень по заданому товару join -j1 1 -j2 1 - $HOME/temp03 | # ===================================================== # Вибирається стовпець кількості cut -f2 -d' ' >$HOME/temp01 # ===================================================== # Початкове значення суми - 0 sum=0 # ===================================================== # Уміст файлу temp01 составляеn список циклу for for value in `cat $HOME/temp01` do # =================================================== # Підсумовування елементів списку sum=`expr "$sum" + "$value"` done # ===================================================== # Вивід результату echo "Продане товару $code в $mon - $sum шт." # ===================================================== # Зрушення списку параметрів shift # ===================================================== # Кінець циклу перебору параметрjв done # ======================================================= # Після виходу із циклу - видалення тимчасових файлів rm $HOME/temp01 rm $HOME/temp02 rm $HOME/temp03 # ======== Кінець скрипта ex7_3 ================================= #Зразок виконання створеної команди:
|
||||||||||||
Последнее изменение этой страницы: 2020-12-09; просмотров: 44; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.189.22.136 (0.011 с.) |