- •Лабораторна робота 3
- •Базові регулярні вираження
- •Метасимволы, використовувані в регулярних вираженнях
- •Приклади регулярних виражень
- •Приклад виконання лабораторної роботи n3 Завдання 1
- •Завдання 2
- •Завдання 3
- •Варіанти індивідуальних завдань
- •Хід роботи
- •Вибрані команди Unix. Короткий опис:
- •Приклад виконання лабораторної роботи n4 Завдання 1
- •Завдання 1, варіант 1
- •Завдання 1, варіант 2
- •Завдання 1, варіант 3
- •Завдання 2
- •Завдання 2 варіант 1
- •Завдання 2, варіант 2
- •Завдання 2, варіант 3
- •Завдання 3
- •Завдання 3 варіант 1
- •Завдання 3 варіант 2
- •Варіанти індивідуальних завдань
- •Хід роботи
- •Команда awk :
- •Опис шаблонів
- •Приклад виконання лабораторної роботи n5 Приклад 1-1
- •Приклад 1-2
- •Приклад 1-3
- •Приклад 2-3.1
- •Приклад 2-3.2
- •Приклад 2-3.3
- •Приклад 2-3.4
- •Варіанти індивідуальних завдань
- •Команда sh:
- •Команда env:
- •Приклад виконання лабораторної роботи n6
- •Варіанти індивідуальних завдань
- •Хід роботи
- •Деякі приклади програмування
- •Приклад 2
- •Приклад 3
- •Варіанти індивідуальних завдань
Вибрані команди Unix. Короткий опис:
Інформаційні команди: info, man.
Введення й редагування текстів: tee, ed, sed, vi
Вивід текстів: cat, more, pr, pg
Команди файлової системи: cd, chgrp, chmod, chown, cp, file, find, ln, ls, mkdir, mv, pwd, rm, rmdir
Обробка [текстових] файлів: awk, cmp, comm, cut, diff, diff3, grep, head, join, paste, sort, split, tali, uniq, wc
Пошта, процеси, час, etc.: cal, date, echo, env, export, kill, mail, mesg, nice, ps, script, sh, who, write
Команди інтерпретатора shell: basename, expr, read, shift, test
Приклад виконання лабораторної роботи n4 Завдання 1
Робота всіх варіантів демонструється на обробці файлу з іменем Hum-Dum.txt, вихідний уміст якого показано в наступному протоколі:
Script started on Thu Sep 5 07:56:10 2002 bash2-2.05$ cat Hum-Dum Humpty-Dumpty Set on the wall. Humpty-Dumpty Had a greate fall. And all the king's horses, And all the king's man. Can not Humpty, Can not Dumpty, Humpty-Dumpty, Dumpty-Humpty, Set on this wall Again. bash2-2.05$ Script done on Thu Sep 5 07:56:21 2002 |
Нижче приводяться деякі загальні міркування за рішенням завдань 1-го завдання.
У більшості випадків ми можемо легко сформулювати оператори потокового редактора, необхідні для виконання заданого перетворення, за винятком одного компонента - адреси рядка, до якого це перетворення повинне бути застосоване. У деяких випадках нам також заздалегідь невідомий і текст, який необхідно вставити в цільовий рядок. Тому типова схема розв'язку наступна:
Визначаються номери рядків, до яких повинні бути застосовані перетворення, а при необхідності - також і текст, який повинен вставлятися в цільовий файл. Для визначення застосовуються статичні (заздалегідь відомі й закладені в текст команд) команди потокового редактора. Результати цього кроку зберігаються у файлі.
Шляхом редагування результатів 1-го кроку динамічно формуються команди sed для виконання перетворення тексти, що містять адреси й, певні на 1-м кроці. Ці команди зберігаються у файлі.
Виконується редагування вихідного тексту командами, збереженими на 2-м кроці.
Можливі два підходи до одержання номерів рядків, що підлягають перетворенню:
виконати нумерування всіх рядків вихідного файлу (це можна зробити командою pr або командою cat з опцією -n), а потім із пронумерованої послідовності рядків вибрати рядок, призначену для обробки з її номером; таке приймання застосоване в розв'язках для варіантів 1 і 2;
вибрати номер рядка, призначеної для обробки, за допомогою команди sed "="; таке приймання застосовано для варіанта 3.
Оскільки Unix має велика кількість утиліт для обробки текстів, причому функції багатьох утиліт перекриваються, кожна із запропонованих завдань може бути вирішена безліччю різних способів.
Завдання 1, варіант 1
Кожне друге слово кожного рядка вивести в окремий наступний рядок. Якщо в рядку тільки одне слово, нічого не робити.
Розв'язок:
pr -n' ' -T Hum-Dum.txt | |
Вивести файл без заголовка й зайвих рядків, але з номерами рядків. |
sed -n 's/ *//p' | |
Вилучити головні пробіли. |
cut -f1,3 -d' ' | |
Вирізати номер і 2-е слово. |
sed -n '/[0-9]/p' >temp01 |
Вилучити рядка, що містять тільки номер, результат зберегти в 1-м тимчасовому файлі. |
cut -f1 -d' ' temp01 | |
Вибрати з 1-го тимчасового файлу номера рядків. |
sed -n 's/$/a\\/p' >temp02 |
Додати до них 'a\' і зберегти в 2-м тимчасовому файлі. |
cut -f2 -d' ' temp01 >temp03 |
Вибрати з 1-го тимчасового файлу слова й зберегти в 3-м тимчасовому файлі. |
paste -d'\n' temp02 temp03 >temp01 |
Зкріпити построково 2-й і 3-й тимчасові файли, вставивши між рядками, що зчіплюються, переклад рядка. Результат зберегти в 1-м тимчасовому файлі. Результат - набір команд sed на вставку. |
sed -f temp01 Hum-Dum.txt >result |
Виконати команди з 1-го тимчасового файлу, зберегти результат. |
rm -f temp* |
Вилучити тимчасові файли. |
Протокол виконання:
Script started on Thu Sep 5 08:00:29 2002 bash2-2.05$ pr -n' ' -T Hum-Dum.txt | > sed -n 's/ *//p' | > cut -f1,3 -d' ' | > sed -n '/[0-9]/p' >temp01 bash2-2.05$ cut -f1 -d' ' temp01 | > sed -n 's/$/a\\/p' >temp02 bash2-2.05$ cut -f2 -d' ' temp01 >temp03 bash2-2.05$ paste -d'\n' temp02 temp03 >temp01 bash2-2.05$ sed -f temp01 Hum-Dum.txt >result bash2-2.05$ rm -f temp* bash2-2.05$ cat result Humpty-Dumpty Set on the wall. on Humpty-Dumpty Had a greate fall. a And all the king's horses, all And all the king's man. all Can not Humpty, not Can not Dumpty, not Humpty-Dumpty, Dumpty-Humpty, Set on this wall on Again. bash2-2.05$ Script done on Thu Sep 5 08:00:47 2002 |
Зверніть увагу на те, що у вищенаведеному протоколі деякі запрошення системи виглядають як "$", а деякі - як ">". Система друкує запрошення ">" (вторинне запрошення), якщо попередня команда закінчується ознакою конвеєра "|" і, отже, обов'язково очікується введення наступної команди. А якщо ні, то друкується первинне запрошення - "$". Символи первинного й вторинного запрошення визначаються змінними оточення PS1 і PS2 відповідно.