Tee, find, cut, date, grep, sort

Tee, find, cut, date, grep, sort

Звернути увагу на метасимволи *, ?, /, […], $ і на правила інтерпретації їх при використанні одинарних та подвійних лапок '…'та"…". Розібратись з використанням в командах операторів перенаправлення потоків і організації конвеєрів ">", "<", "|" і використанням псевдопристрою /dev/null.

3. Відповідно до завдання підготувати послідовність команд для його виконання

Довідковий матеріал

У цій роботі ми розглянемо деякі можливості командних оболонок, які дозволяють користувачам гнучко формувати завдання для виконання операційною системою.

Кожна командна оболонка в процесі свого запуску робить налаштовування системного оточення (виконує ініціалізацію системних змінних та змінних командної оболонки), для чого використовує визначені файли. Їх щонайменше два – глобальний і локальний (деякі оболонки можуть використовувати більшу кількість конфігураційних файлів). Глобальні конфігураційні файли для Tee, find, cut, date, grep, sort всіх оболонок знаходяться в каталозі /etc. Локальні конфігураційні файли для всіх оболонок знаходяться в домашньому каталозі користувача. Імена конфігураційних файлів, як правило, закінчуються на ‘rc’. Локальні файли роблять “прихованими”, щоби вони не заважали користувачу в його повсякденній роботі (приховані файли мають ім’я, що починається з символу ‘.’, команда ls без параметрів їх не показує). Приклади конфігураційних файлів: для sh – /etc/profile і ~/.profile, для csh – /etc/cshrc і ~/.cshrc, для tcsh – /etc/cshrc і ~/.cshrc, а також /etc/tcshrc і ~/.tcshrc (двох останніх може і не бути).

Конфігураційні файли є звичайними командними файлами (докладніше про командні файли див. Лабораторну Tee, find, cut, date, grep, sort роботу №6).

Часто в якості параметру деякої команди нам треба вказати не один файл, а кілька файлів, назви яких мають певні спільні риси. В таких випадках використовують так звані маски пошуку. Спеціальний символ ‘?’ в масці означає один будь-який символ, а спеціальний символ ‘*’ – будь-яку послідовність символів. Наприклад, команда ls /bin/???? виведе на екран всі файли з каталогу /bin, імена яких складаються з чотирьох символів, а команда ls /etc/d* виведе на екран всі файли з каталогу /etc, імена яких починаються з літери d. Також можна задати список символів, наприклад, маска [abc]??? задає ім’я з чотирьох літер Tee, find, cut, date, grep, sort, перша з яких – a, b чи c.

Для пошуку файлів за певними ознаками можна використовувати команду find. Перший параметр цієї команди (обов’язковий) – це каталог, з якого починається пошук (наприклад, / – кореневий каталог), далі – параметр, що задає ознаку пошуку (наприклад, -name – пошук файлів, імена яких відповідають заданій масці, –atime – пошук файлів, дата модифікації яких відповідає заданій умові), далі іде власне маска пошуку, а далі – дія. Найтиповіша дія – –print, вивід результатів пошуку на екран. Якщо цей параметр не вказати, пошук відбуватись буде, а от результатів його видно не буде.

Наприклад:

find / -name "*.c" –print

виведе на екран список всіх файлів, імена яких мають розширення Tee, find, cut, date, grep, sort .с, тобто вихідних кодів на мові програмування С[5].

Ще одна можливість оболонок – перенаправлення потоків вводу-виводу. Як правило, більшість команд (утиліт) приймає інформацію з клавіатури, або з файлу, якщо його вказано як параметр, і виводить результати на екран. Однак, фактично вони працюють із так званими стандартними потоками вводу і виводу, які пов’язані з певними файлами. Файл в системі UNIX розглядається як потік байт. Оскільки пристрої в UNIX розглядаються як файли, а операції вводу і виводу – як читання і запис у відповідні файли, це дозволяє легко переводити вхідний і вихідний потоки з файлів на пристрої чи навпаки.



Стандартний Tee, find, cut, date, grep, sort ввід за замовчанням зчитується з клавіатури. Якщо в якості параметру вказано ім’я файлу, то замість стандартного вводу відповідна утиліта буде організовувати вхідний потік з указаного файлу (але так діють не всі команди!) Вихідних потоків є два – стандартний потік виводу (за замовчанням в сучасних системах – на екран монітору), і потік повідомлень про помилки (за замовчанням – туди ж).

Оболонка дає змогу перенаправити потоки у заданий файл. Символ ‘<’ перенаправляє вхідний потік. Після цього символу очікується ім’я файлу або пристрою, з якого буде братись вхідний потік.

Наприклад, команда cat без параметрів очікує ввід з клавіатури, і кожний рядок передає на екран Tee, find, cut, date, grep, sort монітора. Команда cat my_file замість вводу з клавіатури виведе на екран вміст файлу my_file, якщо такий існує, і повідомлення про помилку, якщо такого не існує.

Команда cat < my_file на перший погляд буде робити те ж саме, але з точки зору операційної системи і самої утиліти cat все буде відбуватись по-іншому. В попередньому випадку командна оболонка запускала утиліту cat і передавала їй параметр командного рядка my_file, а сама утиліта cat вже інтерпретувала цей параметр як ім’я вхідного файлу. В останньому випадку командна оболонка запускала утиліту cat без параметрів, але передавала їй вміст Tee, find, cut, date, grep, sort файлу my_file в якості вхідного потоку.

Команда cat > my_file перенаправляє вихідний потік. Оскільки вхідний потік не перенаправляється, ввід буде очікуватись з клавіатури. Тому ця команда створить файл my_file, якщо він не існує, знищить вміст файлу my_file, якщо він існує, і буде записувати в цей файл все, що буде введено з клавіатури, аж поки не поступить символ кінця файлу EOF (Ctrl+D). Існує також можливість дописати інформацію в кінець файлу, не знищуючи його вмісту. Така команда буде мати вигляд cat >> my_file

Команда

cat my_file2

перенаправляє як вхідний, так і вихідний потік. Якщо файл my_file1 існує Tee, find, cut, date, grep, sort, то його вміст буде записано в файл my_file2. Якщо не існує, то повідомлення про помилку буде виведено на екран. Потік повідомлень про помилки в оболонці sh перенаправляється окремо, він позначається 2>. Наприклад, команда

cat my_file2 2> my_file3

у разі, якщо файл my_file1 існує, запише його вміст в файл my_file2, а якщо не існує, то запише повідомлення про помилку в файл my_file3. Важливо наголосити, що оболонки csh і tcsh не мають засобів безпосередньо перенаправляти потік повідомлень про помилки. Тим не менше, засобами цих оболонок також можна організувати окреме перенаправлення потоків завдяки хитрим прийомам програмування. Інформацію про це Tee, find, cut, date, grep, sort можна знайти в літературі.

Дуже часто потік помилок намагаються взагалі “загасити”. Для того, щоби знищити якийсь потік, існує спеціальний пристрій /dev/null. Все, що в нього направляється, зникає безслідно.

Перенаправлення вводу-виводу широко використовується у двох випадках. Перший – це запуск утиліт у фоновому режимі. Щоби їхня робота не заважала роботі користувача з терміналом, слід так перенаправити потоки вводу-виводу, щоби вони працювали лише з файлами. Другий – це використання спеціальних команд-утиліт, які призначені саме для того, щоби прийняти певну інформацію з одного файлу, обробити її, а результат записати у другий файл. Такі утиліти називаються фільтрами. Утиліта cat, варіанти використання якої з перенаправленням Tee, find, cut, date, grep, sort потоків було розглянуто вище – це простіший фільтр. Він практично не обробляє інформацію, лише може зчіплювати кілька файлів в один. Інші корисні фільтри: cut, grep, sort.

Утиліта cut переглядає вхідний файл, і виділяє з кожного його рядка інформацію за ознаками розміщення в певних колонках або полях. Наприклад, рядки файлу /etc/passwd розділяються на поля за допомогою символу ‘:’. Перше поле – login, п’яте поле – інформація про користувача. Якщо ми хочемо надрукувати лише цю інформацію, ми можемо дати команду:

cut –d: –f1,5 < /etc/passwd

Ключ –d задає символ-роздільник полів (у цьому випадку – ‘:’), ключ –f – список полів, що треба роздрукувати (у цьому Tee, find, cut, date, grep, sort випадку – 1 і 5).

Утиліта grep виводить лише ті рядки, в яких зустрічається заданий рядок пошуку. Утиліта sort виконує сортування вхідного потоку, наприклад, за абеткою. Докладніше про ці та інші фільтри вам слід дізнатися з довідкової системи man.

Існує можливість перенаправити вихідний потік однієї утиліти безпосередньо у вхідний потік іншої, без використання тимчасових файлів. Це так звані конвеєри (pipe). В системі UNIX всі утиліти, що поєднані в конвеєр, запускаються паралельно і обробляють інформацію по мірі її надходження. Конвеєр утворюється за допомогою символу ‘|’ таким чином:

util1 | util2 | util3

При утворені конвеєра окремо перенаправляти вхідні й вихідні потоки на проміжних стадіях не можна Tee, find, cut, date, grep, sort – це буде або сприйнято як синтаксична помилка, або результат може бути непередбачуваним.

Приклад конвеєру:

ps –al | grep root | more

Команда ps з ключами –al направить у вихідний потік список всіх процесів у системі, grep root вибере з них лише ті, які виконуються від імені root’а, more забезпечить вивід їх на екран посторінково. Інший приклад:

cat /etc/passwd | cut –d: –f1,5 | more

Ця команда зробить те ж саме, що й приклад з командою cut, що розглядався раніше, але вивід на екран буде посторінковим.

Якщо проміжні результати на якійсь із стадій конвеєра бажано зберегти, можна скористатись командою tee my_file. Ця команда Tee, find, cut, date, grep, sort візьме вхідний потік, передасть його без змін у вихідний потік і одночасно продублює у файл my_file[6]. Наприклад, так можна модифікувати один із розглянутих вище прикладів:

ps –ef | grep root | tee my_file | more

Тепер ми не лише побачимо на екрані посторінково виведений список всіх процесів root’а, але й збережемо його у файлі my_file.


documentapuuydt.html
documentapuvfob.html
documentapuvmyj.html
documentapuvuir.html
documentapuwbsz.html
Документ Tee, find, cut, date, grep, sort