3.2 Урок 1
Сертифікат: |
Linux Essentials |
---|---|
Версія: |
1.6 |
Розділ: |
3 Потужність командного рядку |
Тема: |
3.2 Пошук і вилучення даних з файлів |
Урок: |
1 з 2 |
Вступ
У цій лабораторній роботі ми зосередимося на переспрямуванні або передачі інформації з одного джерела до іншого за допомогою спеціальних інструментів. Командний рядок Linux перенаправляє інформацію через певні стандартні канали. Стандартним входом (stdin або канал 0) для команди вважається клавіатура, а стандартним виходом (stdout або канал 1) — екран. Існує також інший канал, який призначений для перенаправлення виведення помилок (stderr або канал 2) команди або повідомлень про помилки програми. Вхід та/або вихід можна перенаправляти.
Під час виконання команди іноді ми хочемо передати певну інформацію команді або перенаправити виведення до певного файлу. Кожна з цих функцій буде розглянута в наступних двох розділах.
Перенаправлення введення-виведення (I/O Redirection)
Перенаправлення вводу-виводу дозволяє користувачеві перенаправляти інформацію з команди або до неї за допомогою текстового файлу. Як описано раніше, стандартні введення, виведення та виведення помилок можуть бути перенаправлені, а інформація може бути взята з текстових файлів.
Перенаправлення стандартного виведення
Щоб переспрямувати стандартне виведення до файлу замість екрану, нам потрібно використати оператор >
, за яким слідує ім’я файлу. Якщо файл не існує, буде створено новий, якщо існує, то інформація перезапише наявний файл.
Щоб побачити вміст файлу, який ми щойно створили, ми можемо використовувати команду cat
. За замовчуванням ця команда відображає вміст файлу на екрані. Зверніться до man-сторінки, щоб дізнатися більше про її функції.
Наведений нижче приклад демонструє функціональність оператора. У першому випадку створюється новий файл, що містить текст “Hello World!”:
$ echo "Hello World!" > text $ cat text Hello World!
Під час другого виклику той самий файл перезаписується новим текстом:
$ echo "Hello!" > text $ cat text Hello!
Якщо ми хочемо додати нову інформацію в кінець файлу, нам потрібно використовувати оператор >>
. Цей оператор також створює новий файл, якщо такого файлу не існує.
Перший приклад показує додавання тексту. Як бачимо, новий текст було додано в наступному рядку:
$ echo "Hello to you too!" >> text $ cat text Hello! Hello to you too!
Другий приклад демонструє, що буде створено новий файл:
$ echo "Hello to you too!" >> text2 $ cat text2 Hello to you too!
Перенаправлення стандартної помилки
Щоб перенаправляти лише повідомлення про помилки, користувачу потрібно буде використати оператор 2>
, за яким слід зазначити ім’я файлу, до якого будуть записані помилки. Якщо файл не існує, буде створено новий, інакше файл буде перезаписаний.
Як пояснювалося, каналом для переспрямування стандартної помилки є канал 2. Під час перенаправлення стандартної помилки необхідно вказати канал, на відміну від іншого стандартного виводу, де канал 1 встановлено за замовчуванням. Наприклад, наступна команда шукає файл або каталог з назвою games
і тільки помилку записує до файлу text-error
, одночасно відображаючи стандартне виведення на екрані:
$ find /usr games 2> text-error /usr /usr/share /usr/share/misc ---------Omitted output---------- /usr/lib/libmagic.so.1.0.0 /usr/lib/libdns.so.81 /usr/games $ cat text-error find: `games': No such file or directory
Note
|
Для отримання додаткової інформації про команду |
Наприклад, наступна команда буде виконуватися без помилок, тому жодної інформації не буде записано до файлу text-error
:
$ sort /etc/passwd 2> text-error $ cat text-error
Крім стандартного виведення, стандартну помилку також можна додати до файлу за допомогою оператора 2>>
. Це допише нову помилку в кінець файлу. Якщо файл не існує, буде створено новий. Перший приклад показує додавання нової інформації до файлу, тоді як другий приклад показує, що команда створює новий файл, коли немає існуючого файлу з таким іменем:
$ sort /etc 2>> text-error $ cat text-error sort: read failed: /etc: Is a directory
$ sort /etc/shadow 2>> text-error2 $ cat text-error2 sort: open failed: /etc/shadow: Permission denied
Використовуючи цей тип перенаправлення, лише повідомлення про помилки будуть перенаправлені до файлу, звичайне виведення буде відображене на екрані або направлене на стандартне виведення або stdout.
Існує один конкретний файл, який технічно є bit bucket (файл, який приймає введення і нічого з ним не робить): /dev/null
. Ви можете переспрямувати будь-яку непотрібну інформацію, яку ви не бажаєте відображати або перенаправляти до важливого файлу, як показано в прикладі нижче:
$ sort /etc 2> /dev/null
Перенаправлення стандартного введення
Цей тип перенаправлення використовується для введення даних до команди із зазначеного файлу замість клавіатури. У цьому випадку використовується оператор <
, як показано в прикладі:
$ cat < text Hello! Hello to you too!
Перенаправлення стандартного введення зазвичай використовується з командами, які не приймають файл в якості аргументу. Команда tr
є однією з них. Цю команду можна використовувати для модифікації вмісту файлу, змінюючи символи у файлі певними способами, наприклад, видаляючи будь-який конкретний символ із файлу, приклад нижче показує видалення символу l
:
$ tr -d "l" < text Heo! Heo to you too!
Для отримання додаткової інформації зверніться до man-сторінки команди tr
.
Here Documents
На відміну від перенаправлення виведення, оператор <<
діє інакше порівняно з іншими операторами. Цей вхідний потік також називається here document. Here document представляє собою блок коду або тексту, який можна перенаправити до команди або інтерактивної програми. Різні типи мов сценаріїв, як-от bash
, sh
і csh
, можуть приймати вхідні дані безпосередньо з командного рядку, не використовуючи жодних текстових файлів.
Як видно з прикладу нижче, оператор використовується для введення даних у команду, тоді як слово після цього оператора не визначає назву файлу. Це слово інтерпретується як роздільник введених даних, і воно не буде розглядатися як вміст, тому cat
не відображатиме його:
$ cat << hello > hey > ola > hello hey ola
Зверніться до man-сторінки команди cat
, щоб знайти більше інформації.
Комбінації
Перша комбінація, яку ми розглянемо, поєднує перенаправлення стандартного виведення та стандартного виведення помилок до одного файлу. Використовуються оператори &>
та &>>
, &
представляє комбінацію каналу 1 та каналу 2. Перший оператор перезаписує вміст наявного файлу, інший додає нову інформацію в кінець файлу. Обидва оператори дозволяють створити новий файл, якщо він не існує, як і в попередніх розділах:
$ find /usr admin &> newfile $ cat newfile /usr /usr/share /usr/share/misc ---------Omitted output---------- /usr/lib/libmagic.so.1.0.0 /usr/lib/libdns.so.81 /usr/games find: `admin': No such file or directory $ find /etc/calendar &>> newfile $ cat newfile /usr /usr/share /usr/share/misc ---------Omitted output---------- /usr/lib/libmagic.so.1.0.0 /usr/lib/libdns.so.81 /usr/games find: `admin': No such file or directory /etc/calendar /etc/calendar/default
Давайте розглянемо приклад з використанням команди cut
:
$ cut -f 3 -d "/" newfile $ cat newfile share share share ---------Omitted output---------- lib games find: `admin': No such file or directory calendar calendar find: `admin': No such file or directory
Команда cut
вирізає вказані поля з вхідного файлу за допомогою параметра -f
, 3-го поля в нашому випадку. Для того, щоб команда знайшла поле, потрібно також вказати роздільник із параметром -d
. У нашому випадку роздільником буде символ /
.
Щоб дізнатися більше про команду cut
, зверніться до її man-сторінки.
Конвеєри у командному рядку
Перенаправлення здебільшого використовується з метою збереження результату команди для обробки іншою командою. Такий тип проміжного процесу може стати дуже втомливим і складним, якщо ви хочете, щоб дані проходили через кілька процесів. Щоб уникнути цього, ви можете зв’язати команди безпосередньо через конвеєри. Іншими словами, виведення першої команди автоматично стає введенням для наступної команди. Це зв’язування здійснюється за допомогою оператора |
(вертикальна смуга):
$ cat /etc/passwd | less root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/bin/sh bin:x:2:2:bin:/bin:/bin/sh :
У наведеному вище прикладі команда less
, яка стоїть за оператором конвеєра, змінює спосіб відображення файлу. Команда less
відображає текстовий файл в такий спосіб, що дозволяє користувачеві прокручувати на один рядок вгору і вниз за один раз. less
також використовується за замовчуванням для відображення man-сторінок, як обговорювалося в попередніх уроках.
Можливе використання кількох конвеєрів одночасно. Проміжні команди, які отримують вхідні дані, потім змінюють їх і формують виведення, називаються фільтрами. Давайте візьмемо команду ls -l
і спробуємо порахувати кількість слів з перших 10 рядків виведення. Щоб зробити це, нам доведеться використати команду head
, яка за замовчуванням відображає перші 10 рядків файлу, а потім підрахувати слова за допомогою команди wc
:
$ ls -l | head | wc -w 10
Як згадувалося раніше, за замовчуванням head
відображає лише перші 10 рядків зазначеного текстового файлу. Цю поведінку можна змінити за допомогою спеціальних параметрів. Перегляньте man-сторінку команди, щоб знайти більше інформації.
Існує ще одна команда, яка відображає кінець файлу: tail
. За замовчуванням ця команда вибирає останні 10 рядків і відображає їх, але як і для head
цю кількість також можна змінити. Перевірте man-сторінку tail
для отримання додаткової інформації.
Note
|
Параметр |
Команда wc
(кількість слів) за замовчуванням підраховує рядки, слова та байти файлу. Як показано у вправі, параметр -w
змушує команду підраховувати лише слова у вибраних рядках. Найпоширеніші параметри, які ви можете використовувати з цією командою: -l
, що вказує команді підраховувати лише рядки, і -c
, який використовується для підрахунку лише байтів. Більше варіантів і параметрів команди, а також більше інформації про wc
можна знайти на man-сторінці команди.
Вправи до посібника
-
Виведіть вміст вашого поточного каталогу, включно з правами власності та дозволами, і переспрямуйте вихідні дані до файлу під назвою
contents.txt
у вашому домашньому каталозі. -
Відсортуйте вміст файлу
contents.txt
з поточного каталогу та додайте його в кінець нового файлу з назвоюcontents-sorted.txt
. -
Відобразіть останні 10 рядків файлу
/etc/passwd
і перенаправте їх до нового файлу в вашому каталозі користувачаDocuments
. -
Підрахуйте кількість слів у файлі
contents.txt
і додайте результат до кінця файлуfield2.txt
у вашому домашньому каталозі. Вам потрібно буде використовувати як перенаправлення введення, так і виведення. -
Відобразіть перші 5 рядків файлу
/etc/passwd
і відсортуйте вихідні дані у зворотному алфавітному порядку. -
Використовуючи раніше створений файл
contents.txt
, підрахуйте кількість символів в останніх 9 рядках. -
Підрахуйте кількість файлів під назвою
test
у каталозі/usr/share
та його підкаталогах. Примітка: кожен рядок, виведений командоюfind
, представляє файл.
Дослідницькі вправи
-
Виберіть друге поле файлу
contents.txt
та перенаправте стандартне виведення та виведення помилок до іншого файлу під назвоюfield1.txt
. -
Використовуючи оператор перенаправлення введення та команду
tr
, видаліть тире (-
) із файлуcontents.txt
. -
Яка найбільша перевага в тому, щоб перенаправляти до файлу тільки помилки?
-
Замініть усі пробіли, що повторюються, одним пробілом у файлі
contents.txt
, дані у якому відсортовані за алфавітом. -
В одному командному рядку видаліть пробіли, які повторюються (як це було зроблено в попередній вправі), виберіть дев’яте поле і відсортуйте отриманий результат в зворотному алфавітному порядку і без урахування регістру. Скільки конвеєрів довелося використати?
Підсумки
У цій лабораторній роботі ви дізналися про:
-
Типи переадресації.
-
Як використовувати оператори перенаправлення.
-
Як використовувати конвеєри для фільтрації виведення команд.
Команди, які використовувалися в цьому уроці:
cut
-
Видаляє розділи з кожного рядка файлу.
cat
-
Відображає або об’єднує файли.
find
-
Шукає файли в ієрархії каталогів.
less
-
Відображає файл, дозволяючи користувачеві прокручувати один рядок за раз.
more
-
Відображає файл, сторінку за раз.
head
-
Відображає перші 10 рядків файлу.
tail
-
Відображає останні 10 рядків файлу.
sort
-
Сортує файли.
wc
-
За замовчуванням підраховує рядки, слова або байти файлу.
Відповіді до вправ посібника
-
Введіть вміст вашого поточного каталогу, включно з правами власності та дозволами, і переспрямуйте вихідні дані до файлу під назвою
contents.txt
у вашому домашньому каталозі.$ ls -l > contents.txt
-
Відсортуйте вміст файлу
contents.txt
з поточного каталогу та додайте його в кінець нового файлу з назвоюcontents-sorted.txt
.$ sort contents.txt >> contents-sorted.txt
-
Відобразіть останні 10 рядків файлу
/etc/passwd
і перенаправте їх до нового файлу в вашому каталозі користувачаDocuments
.$ tail /etc/passwd > Documents/newfile
-
Підрахуйте кількість слів у файлі
contents.txt
і додайте результат до кінця файлуfield2.txt
у вашому домашньому каталозі. Вам потрібно буде використовувати як перенаправлення введення, так і виведення.$ wc < contents.txt >> field2.txt
-
Відобразіть перші 5 рядків файлу
/etc/passwd
і відсортуйте вихідні дані у зворотному алфавітному порядку.$ head -n 5 /etc/passwd | sort -r
-
Використовуючи раніше створений файл
contents.txt
, підрахуйте кількість символів в останніх 9 рядках.$ tail -n 9 contents.txt | wc -c 531
-
Підрахуйте кількість файлів під назвою
test
у каталозі/usr/share
та його підкаталогах. Примітка: кожен рядок, виведений командоюfind
, представляє файл.$ find /usr/share -name test | wc -l 125
Відповіді до дослідницьких вправ
-
Виберіть друге поле файлу
contents.txt
та перенаправте стандартне виведення та виведення помилок до іншого файлу під назвоюfield1.txt
.$ cut -f 2 -d " " contents.txt &> field1.txt
-
Використовуючи оператор перенаправлення введення та команду
tr
, видаліть тире (-
) із файлуcontents.txt
.$ tr -d "-" < contents.txt
-
Яка найбільша перевага в тому, щоб перенаправляти до файлу тільки помилки?
Перенаправлення до файлу лише повідомлень про помилки може допомогти зберегти адекватним розмір файлу журналу, який часто відстежується.
-
Замініть усі пробіли, що повторюються, одним пробілом у файлі
contents.txt
, дані у якому відсортовані за алфавітом.$ sort contents.txt | tr -s " "
-
В одному командному рядку видаліть пробіли, які повторюються (як це було зроблено в попередній вправі), виберіть дев’яте поле і відсортуйте отриманий результат в зворотному алфавітному порядку і без урахування регістру. Скільки конвеєрів довелося використати?
$ cat contents.txt | tr -s " " | cut -f 9 -d " " | sort -fr
У вправі використовуються 3 конвеєри, по одному для кожного фільтра.