103.2 Урок 1
Сертифікат: |
LPIC-1 |
---|---|
Версія: |
5.0 |
Розділ: |
103 GNU та команди Unix |
Тема: |
103.2 Обробка текстових потоків за допомогою фільтрів |
Урок: |
1 з 1 |
Вступ
Робота з текстом є основною частиною роботи кожного системного адміністратора. Дуг МакІлрой, член оригінальної команди розробників Unix, підсумував філософію Unix і сказав (серед інших важливих речей): «Створюйте програми для обробки текстових потоків, тому що це універсальний інтерфейс». Linux надихається операційною системою Unix і приймає її філософію, тому адміністратор повинен очікувати багато інструментів для маніпулювання текстом у дистрибутиві Linux.
Короткий огляд перенаправлень і каналів
Також з філософії Unix:
-
Пишіть програми, які роблять щось одне і роблять це добре.
-
Пишіть програми для спільної роботи.
Одним з основних способів змусити програми працювати разом є тунелювання і перенаправлення. Практично всі ваші програми маніпуляції з текстом отримують текст зі стандартного введення (stdin), виводять його на стандартне виведення (stdout) і відправляють можливі помилки на стандартний вихід помилок (stderr). Якщо ви не вкажете інше, стандартним введенням буде те, що ви вводите на клавіатурі (програма прочитає його після натискання клавіші Enter). Аналогічно, стандартне виведення і помилки будуть відображатися на екрані терміналу. Давайте подивимося, як це працює.
У своєму терміналі введіть cat
, а потім натисніть клавішу Enter. Після введіть довільний текст.
$ cat This is a test This is a test Hey! Hey! It is repeating everything I type! It is repeating everything I type! (I will hit ctrl+c so I will stop this nonsense) (I will hit ctrl+c so I will stop this nonsense) ^C
Для отримання додаткової інформації про команду cat
(термін походить від “concatenate”), будь ласка, зверніться до man-сторінок.
Note
|
Якщо ви працюєте над дійсно простим встановленням сервера Linux, деякі команди, такі як |
Як показано вище, якщо ви не вкажете, звідки cat
має читати, вона буде читати зі стандартного введення (незалежно від того, що ви введете) і виведе все, що прочитає, до вікна терміналу (стандартногшо виведення).
Тепер спробуйте наступне:
$ cat > mytextfile This is a test I hope cat is storing this to mytextfile as I redirected the output I will hit ctrl+c now and check this ^C $ cat mytextfile This is a test I hope cat is storing this to mytextfile as I redirected the output I will hit ctrl+c now and check this
>
(знак більше) повідомляє cat
спрямовувати своє виведення до файлу mytextfile
, а не до стандартного виведення. Тепер спробуйте наступне:
$ cat mytextfile > mynewtextfile $ cat mynewtextfile This is a test I hope cat is storing this to mytextfile as I redirected the output I will hit ctrl+c now and check this
Це призводить до копіювання mytextfile
у mynewtextfile
. Ви можете переконатися, що ці два файли мають однаковий вміст, виконавши diff
:
$ diff mynewtextfile mytextfile
Оскільки виведення немає, файли ідентичні. Тепер спробуйте оператор переспрямування з додаванням (>>
):
$ echo 'This is my new line' >> mynewtextfile $ diff mynewtextfile mytextfile 4d3 < This is my new line
Досі ми використовували перенаправлення для створення файлів і керування ними. Ми також можемо використовувати канали (позначені символом |
) для перенаправлення виведення однієї програми до іншої програми. Давайте знайдемо рядки, де зустрічається слово “this”:
$ cat mytextfile | grep this I hope cat is storing this to mytextfile as I redirected the output I will hit ctrl+c now and check this $ cat mytextfile | grep -i this This is a test I hope cat is storing this to mytextfile as I redirected the output I will hit ctrl+c now and check this
Зараз ми передали виведення cat
до іншої команди: grep
. Зверніть увагу, що коли ми ігноруємо регістр (використовуючи параметр -i
), ми отримуємо додатковий рядок у результаті.
Обробка текстових потоків
Читання стисненого файлу
Ми створимо файл під назвою ftu.txt
, який містить список наступних команд:
bzcat cat cut head less md5sum nl od paste sed sha256sum sha512sum sort split tail tr uniq wc xzcat zcat
Тепер ми використаємо команду grep
, щоб вивести всі рядки, що містять текст cat
:
$ cat ftu.txt | grep cat bzcat cat xzcat zcat
Інший спосіб отримати цю інформацію — просто використати команду grep
для безпосереднього фільтрування тексту, без необхідності використовувати іншу програму для відправки текстового потоку до stdout
.
$ grep cat ftu.txt bzcat cat xzcat zcat
Note
|
Пам’ятайте, що існує багато способів виконати те саме завдання в Linux. |
Існують інші команди, які обробляють стислі файли (bzcat
для стиснутих файлів bzip
, xzcat
для xz
стиснених файлів і zcat
для gzip
стиснених файлів). Кожна з них використовується для перегляду вмісту стиснутого файлу на основі використаного алгоритму стиснення.
Переконайтеся, що щойно створений файл ftu.txt
є єдиним у каталозі, а потім створіть gzip
стиснену версію файлу:
$ ls ftu* ftu.txt $ gzip ftu.txt $ ls ftu* ftu.txt.gz
Далі скористайтеся командою zcat
, щоб переглянути вміст gzip стиснутого файлу:
$ zcat ftu.txt.gz bzcat cat cut head less md5sum nl od paste sed sha256sum sha512sum sort split tail tr uniq wc xzcat zcat
Зауважте, що gzip
стисне ftu.txt
у ftu.txt.gz
і видалить вихідний файл. За замовчуванням вихідні дані команди gzip
не відображатимуться. Однак, якщо ви хочете, щоб gzip
повідомляв вам, що він робить, скористайтеся параметром -v
для виведення у «детальному вигляді» (verbose).
Перегляд файлу посторінково
Ви знаєте, що cat
виводить файл до стандартного виведення (якщо файл надається після команди). У файлі /var/log/syslog
ваша система Linux зберігає все важливе, що в ній відбувається. Використайте команду sudo
для підвищення привілеїв, щоб мати можливість прочитати файл /var/log/syslog
:
$ sudo cat /var/log/syslog
…ви побачите повідомлення, які дуже швидко прокручуються у вікні терміналу. Ви можете передати вихідні дані до програми less
, щоб результати розбивалися на сторінки. Використовуючи less
, ви можете використовувати клавіші зі стрілками для навігації по результатах виведення, а також використовувати команди, подібні до vi
, для навігації та пошуку по всьому тексту.
Однак замість того, щоб передати команду cat
до програми виведення інформації посторінково, більш прагматично просто використовувати програму розбиття сторінок безпосередньо:
$ sudo less /var/log/syslog ... (output omitted for clarity)
Отримання частини текстового файлу
Якщо потрібно перевірити лише початок або кінець файлу, існують інші методи. Команда head
використовується для читання перших десяти рядків файлу за замовчуванням, а команда tail
використовується для читання останніх десяти рядків файлу за замовчуванням. Тепер спробуйте:
$ sudo head /var/log/syslog Nov 12 08:04:30 hypatia rsyslogd: [origin software="rsyslogd" swVersion="8.1910.0" x-pid="811" x-info="https://www.rsyslog.com"] rsyslogd was HUPed Nov 12 08:04:30 hypatia systemd[1]: logrotate.service: Succeeded. Nov 12 08:04:30 hypatia systemd[1]: Started Rotate log files. Nov 12 08:04:30 hypatia vdr: [928] video directory scanner thread started (pid=882, tid=928, prio=low) Nov 12 08:04:30 hypatia vdr: [882] registered source parameters for 'A - ATSC' Nov 12 08:04:30 hypatia vdr: [882] registered source parameters for 'C - DVB-C' Nov 12 08:04:30 hypatia vdr: [882] registered source parameters for 'S - DVB-S' Nov 12 08:04:30 hypatia vdr: [882] registered source parameters for 'T - DVB-T' Nov 12 08:04:30 hypatia vdr[882]: vdr: no primary device found - using first device! Nov 12 08:04:30 hypatia vdr: [929] epg data reader thread started (pid=882, tid=929, prio=high) $ sudo tail /var/log/syslog Nov 13 10:24:45 hypatia kernel: [ 8001.679238] mce: CPU7: Core temperature/speed normal Nov 13 10:24:46 hypatia dbus-daemon[2023]: [session uid=1000 pid=2023] Activating via systemd: service name='org.freedesktop.Tracker1.Miner.Extract' unit='tracker-extract.service' requested by ':1.73' (uid=1000 pid=2425 comm="/usr/lib/tracker/tracker-miner-fs ") Nov 13 10:24:46 hypatia systemd[2004]: Starting Tracker metadata extractor... Nov 13 10:24:47 hypatia dbus-daemon[2023]: [session uid=1000 pid=2023] Successfully activated service 'org.freedesktop.Tracker1.Miner.Extract' Nov 13 10:24:47 hypatia systemd[2004]: Started Tracker metadata extractor. Nov 13 10:24:54 hypatia kernel: [ 8010.462227] mce: CPU0: Core temperature above threshold, cpu clock throttled (total events = 502907) Nov 13 10:24:54 hypatia kernel: [ 8010.462228] mce: CPU4: Core temperature above threshold, cpu clock throttled (total events = 502911) Nov 13 10:24:54 hypatia kernel: [ 8010.469221] mce: CPU0: Core temperature/speed normal Nov 13 10:24:54 hypatia kernel: [ 8010.469222] mce: CPU4: Core temperature/speed normal Nov 13 10:25:03 hypatia systemd[2004]: tracker-extract.service: Succeeded.
Щоб вивести кількість рядків, що відображаються, ми можемо передати вихідні дані команди head
до команди nl
, яка відображатиме кількість рядків тексту, переданого до команди:
$ sudo head /var/log/syslog | nl 1 Nov 12 08:04:30 hypatia rsyslogd: [origin software="rsyslogd" swVersion="8.1910.0" x-pid="811" x-info="https://www.rsyslog.com"] rsyslogd was HUPed 2 Nov 12 08:04:30 hypatia systemd[1]: logrotate.service: Succeeded. 3 Nov 12 08:04:30 hypatia systemd[1]: Started Rotate log files. 4 Nov 12 08:04:30 hypatia vdr: [928] video directory scanner thread started (pid=882, tid=928, prio=low) 5 Nov 12 08:04:30 hypatia vdr: [882] registered source parameters for 'A - ATSC' 6 Nov 12 08:04:30 hypatia vdr: [882] registered source parameters for 'C - DVB-C' 7 Nov 12 08:04:30 hypatia vdr: [882] registered source parameters for 'S - DVB-S' 8 Nov 12 08:04:30 hypatia vdr: [882] registered source parameters for 'T - DVB-T' 9 Nov 12 08:04:30 hypatia vdr[882]: vdr: no primary device found - using first device! 10 Nov 12 08:04:30 hypatia vdr: [929] epg data reader thread started (pid=882, tid=929, prio=high)
І ми можемо зробити те саме, надіславши вихідні дані команди tail
до команди wc
, яка за замовчуванням підрахує кількість слів у документі. Використаємо перемикач -l
, щоб вивести кількість рядків тексту, прочитаних командою:
$ sudo tail /var/log/syslog | wc -l 10
Якщо адміністратору потрібно переглянути більше (або менше) на початку файлу або у його кінці, можна використати опцію -n
, щоб обмежити виведення команди:
$ sudo tail -n 5 /var/log/syslog Nov 13 10:37:24 hypatia systemd[2004]: tracker-extract.service: Succeeded. Nov 13 10:37:42 hypatia dbus-daemon[2023]: [session uid=1000 pid=2023] Activating via systemd: service name='org.freedesktop.Tracker1.Miner.Extract' unit='tracker-extract.service' requested by ':1.73' (uid=1000 pid=2425 comm="/usr/lib/tracker/tracker-miner-fs ") Nov 13 10:37:42 hypatia systemd[2004]: Starting Tracker metadata extractor... Nov 13 10:37:43 hypatia dbus-daemon[2023]: [session uid=1000 pid=2023] Successfully activated service 'org.freedesktop.Tracker1.Miner.Extract' Nov 13 10:37:43 hypatia systemd[2004]: Started Tracker metadata extractor. $ sudo head -n 12 /var/log/syslog Nov 12 08:04:30 hypatia rsyslogd: [origin software="rsyslogd" swVersion="8.1910.0" x-pid="811" x-info="https://www.rsyslog.com"] rsyslogd was HUPed Nov 12 08:04:30 hypatia systemd[1]: logrotate.service: Succeeded. Nov 12 08:04:30 hypatia systemd[1]: Started Rotate log files. Nov 12 08:04:30 hypatia vdr: [928] video directory scanner thread started (pid=882, tid=928, prio=low) Nov 12 08:04:30 hypatia vdr: [882] registered source parameters for 'A - ATSC' Nov 12 08:04:30 hypatia vdr: [882] registered source parameters for 'C - DVB-C' Nov 12 08:04:30 hypatia vdr: [882] registered source parameters for 'S - DVB-S' Nov 12 08:04:30 hypatia vdr: [882] registered source parameters for 'T - DVB-T' Nov 12 08:04:30 hypatia vdr[882]: vdr: no primary device found - using first device! Nov 12 08:04:30 hypatia vdr: [929] epg data reader thread started (pid=882, tid=929, prio=high) Nov 12 08:04:30 hypatia vdr: [882] no DVB device found Nov 12 08:04:30 hypatia vdr: [882] initializing plugin: vnsiserver (1.8.0): VDR-Network-Streaming-Interface (VNSI) Server
Основи sed, редактору потоків
Давайте подивимося на інші файли, терміни та утиліти, назви яких не містять cat
. Ми можемо зробити це, передавши параметр -v
до grep
, який наказує команді виводити лише рядки, які не містять cat
:
$ zcat ftu.txt.gz | grep -v cat cut head less md5sum nl od paste sed sha256sum sha512sum sort split tail tr uniq wc
Більшість з того, що ми можемо зробити за допомогою grep
, ми також можемо зробити за допомогою sed
— потокового редактора для фільтрації та перетворення тексту (як зазначено на man-сторінці sed
). Спочатку ми відновимо наш файл ftu.txt
, розпакувавши архів gzip,
де міститься цей файл:
$ gunzip ftu.txt.gz $ ls ftu* ftu.txt
Тепер ми можемо використати sed
, щоб перерахувати лише рядки, що містять текст cat
:
$ sed -n /cat/p < ftu.txt bzcat cat xzcat zcat
Ми використали знак менше ніж <
, щоб спрямувати вміст файлу ftu.txt
до нашої команди sed
. Слово, замкнене між косими рисками (тобто /cat/
), є терміном, який ми шукаємо. Параметр -n
наказує sed
не виконувати жодного виведення (якщо далі відсутня опція p
). Спробуйте запустити цю саму команду без опції -n
, щоб побачити, що станеться. Потім спробуйте наступне:
$ sed /cat/d < ftu.txt cut head less md5sum nl od paste sed sha256sum sha512sum sort split tail tr uniq wc
Якщо ми не використовуємо опцію -n
, sed
виведе все з файлу, за винятком того, що d
вказує видалити з виведення.
Поширеним використанням sed
є пошук і заміна тексту у файлі. Припустимо, що ви хочете змінити кожен текст cat
на dog
. Ви можете використовувати sed
для цього, додавши параметр s
, щоб замінити кожен екземпляр терміну cat
на термін dog
:
$ sed s/cat/dog/ < ftu.txt bzdog dog cut head less md5sum nl od paste sed sha256sum sha512sum sort split tail tr uniq wc xzdog zdog
Замість того, щоб використовувати оператор перенаправлення (<
) для передачі файлу ftu.txt
до нашої команди sed
, ми можемо просто запропонувати команді sed
працювати з файлом безпосередньо. Ми спробуємо зробити це далі, одночасно створюючи резервну копію вихідного файлу:
$ sed -i.backup s/cat/dog/ ftu.txt $ ls ftu* ftu.txt ftu.txt.backup
Опція -i
виконає операцію sed
всередині вашого оригінального файлу. Якщо ви не використовуєте .backup
після параметра -i
, ви просто перезаписуєте свій оригінальний файл. Текст після параметра -i
, буде іменем, під яким буде збережено вихідний файл до змін, які ви внесли в результаті виконання sed
.
Забезпечення цілісності даних
Ми продемонстрували, як легко маніпулювати файлами в Linux. Іноді ви можете надати доступ до файлу комусь іншому, і ви хочете бути впевненими, що одержувач отримає справжню копію оригінального файлу. Це широко використовується, коли сервери дистрибутиву Linux розміщують завантажувані CD або DVD-образи свого програмного забезпечення разом із файлами, які містять обчислені значення контрольної суми цих образів дисків. Ось приклад списку з дзеркала завантаження Debian:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ [PARENTDIR] Parent Directory - [SUM] MD5SUMS 2019-09-08 17:46 274 [CRT] MD5SUMS.sign 2019-09-08 17:52 833 [SUM] SHA1SUMS 2019-09-08 17:46 306 [CRT] SHA1SUMS.sign 2019-09-08 17:52 833 [SUM] SHA256SUMS 2019-09-08 17:46 402 [CRT] SHA256SUMS.sign 2019-09-08 17:52 833 [SUM] SHA512SUMS 2019-09-08 17:46 658 [CRT] SHA512SUMS.sign 2019-09-08 17:52 833 [ISO] debian-10.1.0-amd64-netinst.iso 2019-09-08 04:37 335M [ISO] debian-10.1.0-amd64-xfce-CD-1.iso 2019-09-08 04:38 641M [ISO] debian-edu-10.1.0-amd64-netinst.iso 2019-09-08 04:38 405M [ISO] debian-mac-10.1.0-amd64-netinst.iso 2019-09-08 04:38 334M ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
У наведеному вище списку файли образів програми встановлення Debian супроводжуються текстовими файлами, які містять контрольні суми файлів за різними алгоритмами (MD5, SHA1, SHA256 і SHA512).
Note
|
Контрольна сума – це значення, отримане в результаті математичного обчислення на основі криптографічної хеш-функції для файлу. Існують різні типи криптографічних хеш-функцій, які відрізняються за потужністю. Під час іспиту вам будуть потрібні |
Після того, як ви завантажите файл (наприклад, образ debian-10.1.0-amd64-netinst.iso
), ви порівняєте контрольну суму завантаженого файлу зі значенням контрольної суми, яке було надано вам.
Ось приклад, щоб проілюструвати суть. Ми обчислимо значення SHA256 файлу ftu.txt
за допомогою команди sha256sum
:
$ sha256sum ftu.txt 345452304fc26999a715652543c352e5fc7ee0c1b9deac6f57542ec91daf261c ftu.txt
Довгий рядок символів, що стоїть перед іменем файлу, є значенням контрольної суми SHA256 цього текстового файлу. Давайте створимо файл, який містить це значення, щоб ми могли використати його для перевірки цілісності нашого вихідного текстового файлу. Ми можемо зробити це за допомогою тієї ж команди sha256sum
і перенаправити вихідні дані до файлу:
$ sha256sum ftu.txt > sha256.txt
Тепер, щоб перевірити файл ftu.txt
, ми просто використовуємо ту саму команду та вказуємо ім’я файлу, яке містить значення контрольної суми разом із опцією -c
:
$ sha256sum -c sha256.txt ftu.txt: OK
Значення, що міститься у файлі, відповідає обчисленій контрольній сумі SHA256 для нашого файлу ftu.txt
, як ми і очікували. Однак, якщо вихідний файл був змінений (наприклад, кілька байт було втрачено під час завантаження файлу, або хтось навмисно його підробив), перевірка значення не спрацює. У таких випадках ми знаємо, що наш файл змінений або пошкоджений, і не можемо довіряти цілісності його вмісту. Щоб підтвердити це, ми додамо трохи тексту в кінці файлу:
$ echo "new entry" >> ftu.txt
Тепер ми спробуємо перевірити цілісність файлу:
$ sha256sum -c sha256.txt ftu.txt: FAILED sha256sum: WARNING: 1 computed checksum did NOT match
І ми бачимо, що контрольна сума не відповідає очікуваній для цього файла. Тому ми не можемо довіряти цілісності цього файлу. Ми можемо спробувати завантажити нову копію файлу, повідомити відправника файлу про збій контрольної суми або повідомити про це команді безпеки центру обробки даних залежно від важливості файлу.
Більш глибокий погляд на файли
Команда вісімкового дампу (od
) часто використовується для відлагодження застосунків і різних файлів. Сама по собі команда od
просто покаже вміст файлу у вісімковому форматі. Ми можемо використовувати наш файл ftu.txt
з попередніх прикладів, щоб попрактикуватися з цією командою:
$ od ftu.txt 0000000 075142 060543 005164 060543 005164 072543 005164 062550 0000020 062141 066012 071545 005163 062155 071465 066565 067012 0000040 005154 062157 070012 071541 062564 071412 062145 071412 0000060 060550 032462 071466 066565 071412 060550 030465 071462 0000100 066565 071412 071157 005164 070163 064554 005164 060564 0000120 066151 072012 005162 067165 070551 073412 005143 075170 0000140 060543 005164 061572 072141 000012 0000151
Перший стовпець виводу є байтовим зміщенням для кожного рядка виведення. Оскільки od
за замовчуванням виводить інформацію у вісімковому форматі, кожен рядок починається з байтового зміщення у вісім біт, за яким слідують вісім стовпців, кожен із яких містить вісімкове значення даних у цьому стовпці.
Tip
|
Нагадаємо, що байт має довжину 8 біт. |
Якщо вам потрібно переглянути вміст файлу в шістнадцятковому форматі, скористайтеся параметром -x
:
$ od -x ftu.txt 0000000 7a62 6163 0a74 6163 0a74 7563 0a74 6568 0000020 6461 6c0a 7365 0a73 646d 7335 6d75 6e0a 0000040 0a6c 646f 700a 7361 6574 730a 6465 730a 0000060 6168 3532 7336 6d75 730a 6168 3135 7332 0000100 6d75 730a 726f 0a74 7073 696c 0a74 6174 0000120 6c69 740a 0a72 6e75 7169 770a 0a63 7a78 0000140 6163 0a74 637a 7461 000a 0000151
Тепер кожен із восьми стовпців після байтового зміщення представлений їх шістнадцятковими еквівалентами.
Одним із зручних способів використання команди od
є відлагодження сценаріїв. Наприклад, команда od
може показати нам символи, які ми зазвичай не бачимо, хоч у файлі вони присутні, наприклад, записи переходу на наступний рядок. Ми можемо зробити це за допомогою опції -c
, щоб замість відображення числового позначення для кожного байту, ці записи стовпців відображалися як їх символьні еквіваленти:
$ od -c ftu.txt 0000000 b z c a t \n c a t \n c u t \n h e 0000020 a d \n l e s s \n m d 5 s u m \n n 0000040 l \n o d \n p a s t e \n s e d \n s 0000060 h a 2 5 6 s u m \n s h a 5 1 2 s 0000100 u m \n s o r t \n s p l i t \n t a 0000120 i l \n t r \n u n i q \n w c \n x z 0000140 c a t \n z c a t \n 0000151
Усі записи переходу до нового рядка у файлі представлені прихованими символами \n
. Якщо ви просто хочете переглянути всі символи у файлі, і вам не потрібно бачити інформацію про зміщення байтів, стовпець байтового зміщення можна видалити з виведення таким чином:
$ od -An -c ftu.txt b z c a t \n c a t \n c u t \n h e a d \n l e s s \n m d 5 s u m \n n l \n o d \n p a s t e \n s e d \n s h a 2 5 6 s u m \n s h a 5 1 2 s u m \n s o r t \n s p l i t \n t a i l \n t r \n u n i q \n w c \n x z c a t \n z c a t \n
Вправи до посібника
-
Щойно вашій школі подарували ноутбук, і тепер ви хочете встановити на нього операційну систему Linux. Інструкції немає, і ви були змушені завантажити її з USB-накопичувача без будь-якого графічного інтерфейсу. Ви потрапили до терміналу оболонки, і ви знаєте, що для кожного процесора у вас буде рядок у файлі
/proc/cpuinfo
:processor : 0 vendor_id : GenuineIntel cpu family : 6 model : 158 (рядки пропущені) processor : 1 vendor_id : GenuineIntel cpu family : 6 model : 158 (багато рядків пропущено)
-
Використовуючи команди
grep
таwc
, відобразіть, скільки у вас процесорів. -
Зробіть те ж саме з
sed
замістьgrep
.
-
-
Дослідіть свій локальний файл
/etc/passwd
за допомогою командgrep
,sed
,head
таtail
відповідно до наведених нижче завдань:-
Які користувачі мають доступ до оболонки Bash?
-
У вашій системі є різні користувачі, які створені для роботи з певними програмами або для адміністративних цілей. Вони не мають доступу до оболонки. Скільки таких користувачів існує у вашій системі?
-
Скільки користувачів і груп існує у вашій системі (пам’ятайте: використовуйте лише файл
/etc/passwd
)? -
Виведіть лише перший, останній і десятий рядки вашого файлу
/etc/passwd
.
-
-
Розглянемо цей приклад файлу
/etc/passwd
. Скопіюйте наведені нижче рядки до локального файлу з назвоюmypasswd
для цієї вправи.root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/usr/sbin/nologin sys:x:3:3:sys:/dev:/usr/sbin/nologin sync:x:4:65534:sync:/bin:/bin/sync nvidia-persistenced:x:121:128:NVIDIA Persistence Daemon,,,:/nonexistent:/sbin/nologin libvirt-qemu:x:64055:130:Libvirt Qemu,,,:/var/lib/libvirt:/usr/sbin/nologin libvirt-dnsmasq:x:122:133:Libvirt Dnsmasq,,,:/var/lib/libvirt/dnsmasq:/usr/sbin/nologin carol:x:1000:2000:Carol Smith,Finance,,,Main Office:/home/carol:/bin/bash dave:x:1001:1000:Dave Edwards,Finance,,,Main Office:/home/dave:/bin/ksh emma:x:1002:1000:Emma Jones,Finance,,,Main Office:/home/emma:/bin/bash frank:x:1003:1000:Frank Cassidy,Finance,,,Main Office:/home/frank:/bin/bash grace:x:1004:1000:Grace Kearns,Engineering,,,Main Office:/home/grace:/bin/ksh henry:x:1005:1000:Henry Adams,Sales,,,Main Office:/home/henry:/bin/bash john:x:1006:1000:John Chapel,Sales,,,Main Office:/home/john:/bin/bash
-
Виведіть всіх користувачів групи
1000
(використовуйтеsed
, щоб вибрати лише відповідне поле) у вашому файліmypasswd
. -
Виведіть лише повні імена всіх користувачів цієї групи (використовуйте
sed
таcut
).
-
Дослідницькі вправи
-
Ще раз скориставшись файлом
mypasswd
з попередніх вправ, сформуйте команду Bash, яка вибере одну особу з головного офісу для перемоги в лотереї. Використайте командуsed
, щоб роздрукувати лише рядки для головного офісу, а потім послідовність командcut
, щоб отримати ім’я кожного користувача з цих рядків. Далі відсортуйте ці імена випадковим чином і виведіть лише верхнє ім’я зі списку. -
Скільки людей працює у сфері фінансів, інженерії та продажів? (Подумайте про використання команди
uniq
.) -
Тепер ви хочете підготувати файл CSV (значення, розділені комами), щоб ви могли легко імпортувати з файлу
mypasswd
у попередньому прикладі файлnames.csv
до LibreOffice. Вміст файлу матиме такий формат:First Name,Last Name,Position Carol,Smith,Finance ... John,Chapel,Sales
Порада: використовуйте команди
sed
,cut
таpaste
, щоб досягти бажаних результатів. Зверніть увагу, що кома (,
) буде роздільником для цього файлу. -
Припустимо, що електронна таблиця
names.csv
, створена в попередній вправі, є важливим файлом, і ми хочемо бути впевненими, що ніхто не буде втручатися в нього з моменту, коли ми надішлемо його комусь, до моменту отримання нашим одержувачем. Як ми можемо забезпечити цілісність цього файлу за допомогоюmd5sum
? -
Ви пообіцяли собі, що будете читати класичну книгу по 100 рядків щодня, і вирішили почати з Mariner and Mystic Германа Мелвілла. Придумайте команду, використовуючи
split
, яка розділить цю книгу на розділи по 100 рядків у кожному. Щоб отримати книгу у форматі звичайного тексту, знайдіть її на https://www.gutenberg.org. -
Використовуючи
ls -l
у каталозі/etc
, який тип списку ви отримуєте? Застосувавши командуcut
до результату даної командиls
, як би ви відобразили лише імена файлів? А як щодо імені файлу та власника файлів? Разом із командамиls -l
таcut
використовуйте командуtr
, щоб стиснути декілька входжень пробілу в один пробіл, щоб допомогти у форматуванні виведення за допомогою командиcut
. -
Ця вправа передбачає, що ви працюєте на реальній машині (а не на віртуальній). Ви також повинні мати з собою USB-флешку. Перегляньте man-сторінки для команди
tail
і дізнайтеся, як працювати з файлом, коли до нього додається текст. Відстежуючи вихідні дані командиtail
у файлі/var/log/syslog
, вставте USB-накопичувач. Напишіть повну команду, яку ви б використали, щоб отримати назву пристрою, виробника та загальний обсяг пам’яті вашого USB-накопичувача.
Підсумки
Робота з текстовими потоками має велике значення при адмініструванні будь-якої системи Linux. Текстові потоки можна обробляти за допомогою скриптів для автоматизації щоденних завдань або пошуку відповідної налагоджувальної інформації у файлах журналів. Ось короткий підсумок команд, які розглядаються в цьому уроці:
cat
-
Використовується для об’єднання або читання звичайних текстових файлів.
bzcat
-
Дозволяє обробляти або читати файли, стиснуті за допомогою методу
bzip2
. xzcat
-
Дозволяє обробляти або читати файли, стиснуті за допомогою методу
xz
. zcat
-
Дозволяє обробляти або читати файли, стиснуті за допомогою методу
gzip
. less
-
Ця команда розбиває на сторінки вміст файлу, а також надає функціональні можливості навігації та пошуку.
head
-
Ця команда відобразить перші 10 рядків файлу за замовчуванням. За допомогою опції
-n
можна відобразити менше або більше рядків. tail
-
Ця команда відобразить останні 10 рядків файлу за замовчуванням. За допомогою опції
-n
можна відобразити менше або більше рядків. Параметр-f
використовується, щоб стежити за виведенням текстового файлу, якщо до нього записуються нові дані. wc
-
Скорочено від “word count”, але залежно від параметрів, які ви використовуєте, команда рахуватиме символи, слова або рядки.
sort
-
Використовується для організації виведення списку в алфавітному, зворотному алфавітному порядку або у випадковому порядку.
uniq
-
Використовується для виведення (і підрахунку) відповідних рядків.
od
-
Команда “octal dump” використовується для відображення двійкового файлу у вісімковому, десятковому або шістнадцятковому форматі.
nl
-
Команда `number line`" відобразить кількість рядків у файлі, а також відтворить файл з номером кожного рядка попереду нього.
sed
-
Редактор потоку можна використовувати для пошуку відповідних входжень рядків за допомогою регулярних виразів, а також для редагування файлів за допомогою попередньо визначених шаблонів.
tr
-
Команда translate може замінювати символи, а також видаляє та стискає повторювані символи.
cut
-
Ця команда може виводити стовпці текстових файлів як поля на основі роздільника символів файлу.
paste
::Об’єднує файли в стовпці на основі використання роздільників полів.
split
-
Ця команда може розділити більші файли на менші залежно від критеріїв, встановлених параметрами команди.
md5sum
-
Використовується для розрахунку хеш-значення MD5 файлу. Також використовується для перевірки файлу на відповідність наявному хеш-значенню, щоб забезпечити цілісність файлу.
sha256sum
-
Використовується для розрахунку хеш-значення SHA256 файлу. Також використовується для перевірки файлу на відповідність наявному хеш-значенню, щоб забезпечити цілісність файлу.
sha512sum
-
Використовується для розрахунку хеш-значення SHA512 файлу. Також використовується для перевірки файлу на відповідність наявному хеш-значенню, щоб забезпечити цілісність файлу.
Відповіді на вправи до посібника
-
Щойно вашій школ подарували ноутбук, і тепер ви хочете встановити на нього операційну систему Linux. Інструкції немає, і ви були змушені завантажити її з USB-накопичувача без будь-якого графічного інтерфейсу. Ви потрапили до терміналу оболонки, і ви знаєте, що для кожного процесора у вас буде рядок у файлі
/proc/cpuinfo
:processor : 0 vendor_id : GenuineIntel cpu family : 6 model : 158 (рядки пропущені) processor : 1 vendor_id : GenuineIntel cpu family : 6 model : 158 (багато рядків пропущено)
*Використовуючи команди
grep
таwc
, відобразіть, скільки у вас процесорів.Існують два варіанти виконання цієї задачі:
$ cat /proc/cpuinfo | grep processor | wc -l $ grep processor /proc/cpuinfo | wc -l
Тепер, коли ви знаєте, що є кілька способів зробити те саме, як правильно обрати потрібний? Це дійсно залежить від кількох факторів, двома найважливішими з яких є продуктивність і читабельність. У більшості випадків ви будете використовувати команди оболонки всередині сценаріїв оболонки, щоб автоматизувати свої завдання, і чим більшими та складнішими стають ваші сценарії, тим більше вам потрібно турбуватися про їх швидке виконання.
-
Зробіть те ж саме з
sed
замістьgrep
.Тепер замість
grep
ми спробуємо це за допомогоюsed
:$ sed -n /processor/p /proc/cpuinfo | wc -l
Тут ми використовували
sed
з параметром-n
, томуsed
не друкуватиме нічого, окрім того, що відповідає виразуprocessor
, як в команді зазначеноp
. Як ми робили в рішенняхgrep
,wc -l
буде рахувати кількість рядків, отже, кількість процесорів, які ми маємо.Дослідіть наступний приклад:
$ sed -n /processor/p /proc/cpuinfo | sed -n '$='
Ця послідовність команд забезпечує результати, ідентичні до попереднього прикладу, де вихідні дані
sed
були передані до командиwc
. Різниця тут полягає в тому, що замість використанняwc -l
для підрахунку кількості рядків,sed
знову викликається для забезпечення еквівалентної функціональності. Ще раз ми нівелюємо вихідні даніsed
за допомогою параметра-n
, за винятком виразу, який ми явно викликаємо, а саме'$='
. Цей вираз вказуєsed
відповідати останньому рядку ($
), а потім надрукувати номер цього рядка (=
).
-
-
Дослідіть свій локальний файл
/etc/passwd
за допомогою командgrep
,sed
,head
таtail
відповідно до наведених нижче завдань:*Які користувачі мають доступ до оболонки Bash?
$ grep ":/bin/bash$" /etc/passwd
Ми оптимізуємо цю відповідь, відобразивши лише ім’я користувача, який використовує оболонку Bash.
$ grep ":/bin/bash$" /etc/passwd | cut -d: -f1
Ім’я користувача є першим полем (параметр
-f1
командиcut
), а файл/etc/passwd
використовує:
як роздільники (-d:
параметр командиcut
). просто передайте вихідні дані командиgrep
до відповідної командиcut
.-
У вашій системі є різні користувачі, які створені для роботи з певними програмами або для адміністративних цілей. Вони не мають доступу до оболонки. Скільки таких користувачів існує у вашій системі?
Найпростіший спосіб - роздрукувати рядки облікових записів, які не використовують оболонку Bash:
$ grep -v ":/bin/bash$" /etc/passwd | wc -l
-
Скільки користувачів і груп існує у вашій системі (пам’ятайте: використовуйте лише файл
/etc/passwd
)Перше поле будь-якого рядка у вашому файлі
/etc/passwd
є ім’ям користувача, друге, як правило, єx
, що вказує, що пароль користувача тут не зберігається (він зашифрований у файлі/etc/shadow
). Третій — це ідентифікатор користувача (UID), а четвертий — ідентифікатор групи (GID). Отже, наступна команда має дати нам кількість користувачів:$ cut -d: -f3 /etc/passwd | wc -l
Ну, в більшості випадків так і буде. Однак існують ситуації, коли ви встановлюєте різних суперкористувачів або інші особливі типи користувачів, які мають однаковий UID (ідентифікатор користувача). Отже, щоб бути в безпеці, ми передаємо результат нашої команди
cut
командіsort
, а потім підраховуємо кількість рядків.$ cut -d: -f3 /etc/passwd | sort -u | wc -l
Тепер щодо кількості груп:
$ cut -d: -f4 /etc/passwd | sort -u | wc -l
-
Виведіть лише перший, останній і десятий рядки вашого файлу
/etc/passwd
Це треба зробити наступним чином:
$ sed -n -e '1'p -e '10'p -e '$'p /etc/passwd
Пам’ятайте, що опція
-n
повідомляєsed
не друкувати нічого, крім того, що вказано командоюp
. Знак долара ($
), що використовується тут, є регулярним виразом, що означає останній рядок файлу.
-
-
Розглянемо цей приклад файлу
/etc/passwd
. Скопіюйте наведені нижче рядки до локального файлу з назвоюmypasswd
для цієї вправи.root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/usr/sbin/nologin sys:x:3:3:sys:/dev:/usr/sbin/nologin sync:x:4:65534:sync:/bin:/bin/sync nvidia-persistenced:x:121:128:NVIDIA Persistence Daemon,,,:/nonexistent:/sbin/nologin libvirt-qemu:x:64055:130:Libvirt Qemu,,,:/var/lib/libvirt:/usr/sbin/nologin libvirt-dnsmasq:x:122:133:Libvirt Dnsmasq,,,:/var/lib/libvirt/dnsmasq:/usr/sbin/nologin carol:x:1000:2000:Carol Smith,Finance,,,Main Office:/home/carol:/bin/bash dave:x:1001:1000:Dave Edwards,Finance,,,Main Office:/home/dave:/bin/ksh emma:x:1002:1000:Emma Jones,Finance,,,Main Office:/home/emma:/bin/bash frank:x:1003:1000:Frank Cassidy,Finance,,,Main Office:/home/frank:/bin/bash grace:x:1004:1000:Grace Kearns,Engineering,,,Main Office:/home/grace:/bin/ksh henry:x:1005:1000:Henry Adams,Sales,,,Main Office:/home/henry:/bin/bash john:x:1006:1000:John Chapel,Sales,,,Main Office:/home/john:/bin/bash
-
Виведіть всіх користувачів групи
1000
(використовуйтеsed
, щоб вибрати лише відповідне поле) у вашому файліmypasswd
.GID — це четверте поле у файлі
/etc/passwd
. Можливо, у вас виникне спокуса спробувати це:$ sed -n /1000/p mypasswd
У такому випадку ви також отримаєте цей рядок:
carol:x:1000:2000:Carol Smith,Finance,,,Main Office:/home/carol:/bin/bash
Ви знаєте, що це неправильно, оскільки Керол Сміт є членом GID 2000, і збіг відбувся через UID. Однак ви, можливо, помітили, що після GID наступне поле починається з символу верхнього регістру. Для вирішення цієї проблеми ми можемо використовувати регулярний вираз.
$ sed -n /:1000:[A-Z]/p mypasswd
Вираз
[A-Z]
відповідатиме будь-якому символу верхнього регістру. Детальніше про це ви дізнаєтеся на відповідному уроці. -
Виведіть лише повні імена всіх користувачів цієї групи (використовуйте
sed
таcut
).Використовуйте ту саму техніку, яку ви використовували для розв’язування першої частини цієї вправи, і спробуйте її з командою
cut
.$ sed -n /:1000:[A-Z]/p mypasswd | cut -d: -f5 Dave Edwards,Finance,,,Main Office Emma Jones,Finance,,,Main Office Frank Cassidy,Finance,,,Main Office Grace Kearns,Engineering,,,Main Office Henry Adams,Sales,,,Main Office John Chapel,Sales,,,Main Office
Не зовсім там! Зверніть увагу, як поля в результатах можуть бути розділені символами
,
. Таким чином, ми передаємо вихідні дані до іншої командиcut
, використовуючи,
як роздільник.$ sed -n /:1000:[A-Z]/p mypasswd | cut -d: -f5 | cut -d, -f1 Dave Edwards Emma Jones Frank Cassidy Grace Kearns Henry Adams John Chapel
-
Відповіді до дослідницьких вправ
-
Ще раз скориставшись файлом
mypasswd
з попередніх вправ, сформуйте команду Bash, яка вибере одну особу з головного офісу для перемоги в лотереї. Використайте командуsed
, щоб роздрукувати лише рядки для головного офісу, а потім послідовність командcut
, щоб отримати ім’я кожного користувача з цих рядків. Далі відсортуйте ці імена випадковим чином і виведіть лише верхнє ім’я зі списку.Спочатку дослідіть, як опція
-R
маніпулює результатами командиsort
. Повторіть цю команду кілька разів на своєму комп’ютері (зверніть увагу, що вам потрібно буде взяти 'Main Office' в одинарні лапки, томуsed
оброблятиме це як один рядок):$ sed -n /'Main Office'/p mypasswd | cut -d: -f5 | cut -d, -f1 | sort -R
Ось рішення проблеми:
$ sed -n /'Main Office'/p mypasswd | cut -d: -f5 | cut -d, -f1 | sort -R | head -1
-
Скільки людей працює у сфері фінансів, інженерії та продажів? (Подумайте про використання команди
uniq
.)Продовжуйте розвивати те, чому ви навчилися з попередніх вправ. Спробуйте наступне:
$ sed -n /'Main Office'/p mypasswd $ sed -n /'Main Office'/p mypasswd | cut -d, -f2
Зауважте, що ми не звертаємо увагу на
:
як роздільник. Нам просто потрібно друге поле, коли ми розбиваємо рядки на символи,
.$ sed -n /'Main Office'/p mypasswd | cut -d, -f2 | uniq -c 4 Finance 1 Engineering 2 Sales
Команда
uniq
виводить лише унікальні рядки (що не повторюються), а параметр-c
повідомляєuniq
підраховувати повторення однакових рядків. Тут є застереження:uniq
розглядатиме лише суміжні рядки. Якщо це не ваш випадок, вам доведеться скористатися командоюsort
. -
Тепер ви хочете підготувати файл CSV (значення, розділені комами), щоб ви могли легко імпортувати з файлу
mypasswd
у попередньому прикладі файлnames.csv
до LibreOffice. Вміст файлу матиме такий формат:First Name,Last Name,Position Carol,Smith,Finance ... John,Chapel,Sales
Порада: використовуйте команди
sed
,cut
таpaste
, щоб досягти бажаних результатів. Зверніть увагу, що кома (,) буде роздільником для цього файлу.Почніть з команд
sed
іcut
, ґрунтуючись на тому, чому ми навчилися з попередніх вправ:$ sed -n /'Main Office'/p mypasswd | cut -d: -f5 | cut -d" " -f1 > firstname
Тепер у нас є файл
firstname
з іменами наших співробітників.$ sed -n /'Main Office'/p mypasswd | cut -d: -f5 | cut -d" " -f2 | cut -d, -f1 > lastname
Тепер у нас є файл
lastname
, який містить прізвища кожного зі співробітників.Далі ми визначаємо, в якому відділі працює кожен співробітник:
$ sed -n /'Main Office'/p mypasswd | cut -d: -f5 | cut -d, -f2 > department
Перш ніж працювати над остаточним рішенням, спробуйте виконати наступні команди, щоб побачити, який тип результату вони генерують:
$ cat firstname lastname department $ paste firstname lastname department
А тепер остаточне рішення:
$ paste firstname lastname department | tr '\t' , $ paste firstname lastname department | tr '\t' , > names.csv
Тут ми використовуємо команду
tr
для translate\t
, роздільника табуляції, за допомогою,
.tr
дуже корисний, коли нам потрібно замінити один символ на інший. Обов’язково ознайомтесь з man-сторінками дляtr
іpaste
. Наприклад, ми можемо використовувати опцію-d
для роздільника, щоб зробити попередню команду менш складною:$ paste -d, firstname lastname department
Ми використали тут команду
paste
, коли нам потрібно було ознайомити вас із нею. Однак ми могли б легко виконати всі завдання в одному ланцюжку команд:$ sed -n /'Main Office'/p mypasswd | cut -d: -f5 | cut -d, -f1,2 | tr ' ' , > names.csv
-
Припустимо, що електронна таблиця
names.csv
, створена в попередній вправі, є важливим файлом, і ми хочемо бути впевненими, що ніхто не буде втручатися в нього з моменту, коли ми надішлемо його комусь, до моменту отримання нашим одержувачем. Як ми можемо забезпечити цілісність цього файлу за допомогоюmd5sum
?Якщо ви заглянете в man-сторінки для
md5sum
,sha256sum
іsha512sum
, ви побачите, що всі вони починаються з такого тексту:“compute and check XXX message digest”
Де "XXX" - це алгоритм, який використовуватиметься для створення цього дайджеста повідомлення.
Ми будемо використовувати
md5sum
як приклад, а пізніше ви можете спробувати з іншими командами.$ md5sum names.csv 61f0251fcab61d9575b1d0cbf0195e25 names.csv
Тепер, наприклад, ви можете зробити файл доступним через безпечну службу ftp і надіслати згенерований дайджест повідомлення, використовуючи інший безпечний засіб зв’язку. Якщо файл було дещо змінено, дайджест повідомлення буде зовсім іншим. Щоб довести це, відредагуйте
names.csv
і змініть Jones на James, як показано тут:$ sed -i.backup s/Jones/James/ names.csv $ md5sum names.csv f44a0d68cb480466099021bf6d6d2e65 names.csv
Щоразу, коли ви робите файли доступними для завантаження, завжди добре розповсюджувати дайджест повідомлення, щоб люди, які завантажили ваш файл, могли створити новий дайджест повідомлення та звірити його з оригіналом. Якщо ви переглянете https://kernel.org, ви знайдете сторінку https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/sha256sums.asc, де ви можете отримати sha256sum для всіх файлів, доступних для завантаження.
-
Ви пообіцяли собі, що будете читати класичну книгу по 100 рядків щодня, і вирішили почати з Mariner and Mystic Германа Мелвілла. Придумайте команду, використовуючи
split
, яка розділить цю книгу на розділи по 100 рядків у кожному. Щоб отримати книгу у форматі звичайного тексту, знайдіть її на https://www.gutenberg.org.Спочатку ми отримаємо всю книгу з сайту Project Gutenberg, де ви можете отримати цю та інші книги, які є у відкритому доступі.
$ wget https://www.gutenberg.org/files/50461/50461-0.txt
Можливо, вам знадобиться встановити
wget
, якщо він ще не встановлений у вашій системі. Крім того, ви також можете використовуватиcurl
. Використовуйтеless
, щоб впевнитися, що це та книга:$ less 50461-0.txt
Тепер ми розділимо книгу на частини по 100 рядків у кожній:
$ split -l 100 -d 50461-0.txt melville
50461-0.txt
– це файл, який ми будемо розділяти.melville
буде префіксом для розділених файлів. Опція-l 100
визначає кількість рядків, а опція-d
вказуєsplit
пронумерувати файли (використовуючи наданий суфікс). Ви можете використовуватиnl
у будь-якому з розділених файлів (ймовірно, не в останньому) і підтвердити, що кожен із них має 100 рядків. -
Використовуючи
ls -l
у каталозі/etc
, який тип списку ви отримуєте? Застосувавши командуcut
до результату даної командиls
, як би ви відобразили лише імена файлів? А як щодо імені файлу та власника файлів? Разом із командамиls -l
таcut
використовуйте командуtr
, щоб стиснути декілька входжень пробілу в один пробіл, щоб допомогти у форматуванні виведення за допомогою командиcut
.Команда
ls
сама по собі надасть вам лише імена файлів. Однак ми можемо сформувати вихідні дані черезls -l
(довгий список), щоб отримати більш конкретну інформацію.$ ls -l /etc | tr -s ' ' , drwxr-xr-x,3,root,root,4096,out,24,16:58,acpi -rw-r--r--,1,root,root,3028,dez,17,2018,adduser.conf -rw-r--r--,1,root,root,10,out,2,17:38,adjtime drwxr-xr-x,2,root,root,12288,out,31,09:40,alternatives -rw-r--r--,1,root,root,401,mai,29,2017,anacrontab -rw-r--r--,1,root,root,433,out,1,2017,apg.conf drwxr-xr-x,6,root,root,4096,dez,17,2018,apm drwxr-xr-x,3,root,root,4096,out,24,16:58,apparmor drwxr-xr-x,9,root,root,4096,nov,6,20:20,apparmor.d
Опція
-s
наказуєtr
стиснути повторювані пробіли в один екземпляр пробілу. Командаtr
працює з будь-яким типом повторюваного символу, який ви вкажете. Потім ми замінюємо пробіли комою,
. Насправді нам не потрібно замінювати пробіли в нашому прикладі, тому ми просто опустимо,
.$ ls -l /etc | tr -s ' ' drwxr-xr-x 3 root root 4096 out 24 16:58 acpi -rw-r--r-- 1 root root 3028 dez 17 2018 adduser.conf -rw-r--r-- 1 root root 10 out 2 17:38 adjtime drwxr-xr-x 2 root root 12288 out 31 09:40 alternatives -rw-r--r-- 1 root root 401 mai 29 2017 anacrontab -rw-r--r-- 1 root root 433 out 1 2017 apg.conf drwxr-xr-x 6 root root 4096 dez 17 2018 apm drwxr-xr-x 3 root root 4096 out 24 16:58 apparmor
Якщо я хочу бачити лише назви файлів, то все, що нам потрібно відобразити, це дев’яте поле:
$ ls -l /etc | tr -s ' ' | cut -d" " -f9
Для імені файлу та власника файлу нам знадобляться дев’яте та третє поля:
$ ls -l /etc | tr -s ' ' | cut -d" " -f9,3
Що робити, якщо нам потрібні лише ім’я каталогу та його власник?
$ ls -l /etc | grep ^d | tr -s ' ' | cut -d" " -f9,3
-
Ця вправа передбачає, що ви працюєте на реальній машині (а не на віртуальній). Ви також повинні мати з собою USB-флешку. Перегляньте man-сторінки для команди
tail
і дізнайтеся, як працювати з файлом, коли до нього додається текст. Відстежуючи вихідні дані командиtail
у файлі/var/log/syslog
, вставте USB-накопичувач. Напишіть повну команду, яку ви б використали, щоб отримати назву пристрою, виробника та загальний обсяг пам’яті вашого USB-накопичувача.$ tail -f /var/log/syslog | grep -i 'product\:\|blocks\|manufacturer' Nov 8 06:01:35 brod-avell kernel: [124954.369361] usb 1-4.3: Product: Cruzer Blade Nov 8 06:01:35 brod-avell kernel: [124954.369364] usb 1-4.3: Manufacturer: SanDisk Nov 8 06:01:37 brod-avell kernel: [124955.419267] sd 2:0:0:0: [sdc] 61056064 512-byte logical blocks: (31.3 GB/29.1 GiB)
Звісно, це приклад, і результати можуть відрізнятися залежно від виробника USB-накопичувача. Зверніть увагу, що ми використовуємо опцію
-i
з командоюgrep
, оскільки не впевнені, що рядки, які ми шукаємо, представлені у верхньому чи нижньому регістрі. Ми також використовували|
як логічне АБО, тому шукаємо рядки, що містятьproduct
АБОblocks
АБОmanufacturer
.