Linux давно став основою серверної інфраструктури, хмарних платформ, контейнеризації та багатьох інструментів кібербезпеки. Для DevOps і DevSecOps уміння працювати з цією системою через термінал є однією з базових навичок. У першій частині серії розберемо структуру файлової системи Linux, основні команди навігації, створення та керування файлами, а також інструменти пошуку й аналізу інформації.
Цим матеріалом ми відкриваємо серію з чотирьох статей про Linux для DevOps і DevSecOps. Вона розрахована як на тих, хто лише знайомиться із системою, так і на спеціалістів, які хочуть освіжити знання та впорядкувати роботу з командним рядком. Почнемо з основ, які постійно використовуються під час адміністрування серверів, налаштування застосунків і перевірки системної безпеки.
Не будемо витрачати час на довгі пояснення, що таке операційна система або навіщо потрібен термінал. Натомість розглянемо конкретні інструменти, їхні можливості та приклади використання. Більшість наведених команд можна виконати у звичайному Linux-середовищі, хоча окремі шляхи та доступні утиліти можуть відрізнятися залежно від дистрибутива.
Файлова система Linux організована у вигляді єдиного дерева каталогів, яке починається з кореневого каталогу /. На відміну від Windows, де користувач зазвичай працює з окремими дисками C:, D: та іншими літерами, у Linux усі файлові системи підключаються до спільної ієрархії через точки монтування.
Це означає, що системні конфігурації, програми, домашні каталоги користувачів, журнали подій і навіть інтерфейси до пристроїв мають своє місце в загальній структурі. Розуміння цієї організації допомагає швидше знаходити потрібні файли та орієнтуватися в незнайомій системі.
Спрощена структура кореневого каталогу має такий вигляд:
/ ├── etc # Системні конфігурації ├── var # Журнали, кеш і змінні дані ├── proc # Інформація про процеси та ядро ├── sys # Інтерфейси до пристроїв і драйверів ├── tmp # Тимчасові файли ├── home # Домашні каталоги користувачів ├── root # Домашній каталог суперкористувача ├── dev # Файли пристроїв ├── usr # Програми, бібліотеки та ресурси ├── bin # Базові виконувані програми ├── sbin # Системні утиліти адміністрування ├── opt # Додаткове програмне забезпечення ├── run # Дані активних служб ├── mnt # Точки монтування └── boot # Файли завантаження системи
У сучасних дистрибутивах каталоги /bin та /sbin часто є символічними посиланнями на відповідні каталоги всередині /usr. Також у реальній системі можуть бути присутні /srv, /media та інші каталоги. Наведене дерево показує насамперед ті розташування, з якими найчастіше доводиться працювати.
Каталог
/etc містить системні конфігурації. Саме тут розміщуються налаштування служб, мережевих компонентів і багатьох установлених програм. Наприклад, файл/etc/hostsвикористовується для локального зіставлення імен хостів з IP-адресами,/etc/fstabописує файлові системи для монтування, а/etc/ssh/sshd_configвідповідає за налаштування SSH-сервера, якщо він установлений. Для DevSecOps перевірка цього каталогу важлива, оскільки помилки в конфігураціях можуть призводити до небажаного відкриття доступу або інших проблем безпеки.
Каталог
/var призначений для даних, які змінюються під час роботи системи. Тут можуть зберігатися кеш, черги завдань, дані окремих служб і журнали подій. Особливо важливий підкаталог/var/log, де на багатьох системах розташовані журнали авторизації, вебсерверів та інших компонентів. Якщо застосунок перестав працювати або сервер поводиться незвично, аналіз журналів часто стає одним із перших кроків діагностики.
Каталоги
/proc і/sys відрізняються від звичайних директорій. Вони надають доступ до віртуальних файлових систем, через які ядро Linux повідомляє інформацію про процеси, обладнання та внутрішній стан системи. Наприклад,/proc/cpuinfoмістить відомості про процесори,/proc/meminfoпоказує статистику використання пам’яті, а підкаталоги/proc, названі за PID, дозволяють досліджувати окремі процеси. Через/sysможна переглядати властивості пристроїв, драйверів і деяких підсистем ядра. Частина параметрів доступна також для зміни, тому записувати щось у ці каталоги без розуміння наслідків не варто.
Каталоги
/home і/root використовуються для даних користувачів. У/homeзазвичай розташовані домашні каталоги звичайних облікових записів, тоді як/rootє домашнім каталогом суперкористувача. Тут можуть зберігатися особисті файли, налаштування командної оболонки, SSH-ключі та конфігурації інструментів розробки. Зокрема, прихований каталог~/.sshчасто містить налаштування SSH-клієнта та ключові матеріали, тому доступ до нього потрібно контролювати.
Окремо варто пам’ятати про /tmp, /dev і /run. Перший використовується для тимчасових файлів, другий надає файлові інтерфейси до пристроїв, а третій містить дані активних служб і процесів. Вміст /tmp може очищатися автоматично, тому зберігати там важливу інформацію без резервної копії не слід.
Для повсякденної роботи не потрібно запам’ятовувати призначення кожного каталогу. Значно важливіше розуміти загальну логіку: конфігурації зазвичай шукають у /etc, журнали у /var/log, дані процесів у /proc, а користувацькі файли у відповідних домашніх каталогах.
Під час роботи з Linux-серверами графічний інтерфейс часто взагалі відсутній. Адміністратор підключається через SSH і виконує необхідні операції в командному рядку. Тому перше, чому потрібно навчитися, це швидко визначати своє розташування, переходити між каталогами та переглядати їхній вміст.
Для цього достатньо опанувати три основні команди: pwd, cd і ls.
Команда pwd (print working directory) показує абсолютний шлях до поточного робочого каталогу. Наприклад:
pwd
Результат може виглядати так:
/home/devops/projects
Це означає, що користувач перебуває в каталозі projects, який розташований усередині його домашньої директорії. Команда особливо корисна після тривалого переміщення файловою системою або під час виконання скриптів, де важливо знати, відносно якого каталогу обробляються шляхи.
Для визначення фізичного шляху, з урахуванням переходів через символічні посилання, можна використати pwd -P. Варіант pwd -L показує логічний шлях, який може зберігати такі переходи.
Переміщення між каталогами виконується через cd (change directory). Команда приймає абсолютні або відносні шляхи. Абсолютний шлях завжди починається із символу / і визначає розташування від кореня файлової системи. Відносний шлях обчислюється від поточного каталогу.
Розглянемо найпоширеніші варіанти:
cd /etc cd /var/log cd .. cd ../.. cd ~ cd -
У першому та другому випадках ми переходимо до конкретних системних каталогів. Команда cd .. переміщує на один рівень вище, а cd ../.. одразу на два рівні. Символ ~ позначає домашній каталог поточного користувача, тому cd ~ дозволяє швидко повернутися до нього незалежно від початкового розташування.
Особливо зручна команда cd -, яка повертає до попереднього робочого каталогу. Наприклад, якщо ви перевіряєте конфігурацію в /etc/nginx, а потім переходите до /var/log/nginx, можна перемикатися між цими розташуваннями без повторного введення повних шляхів.
Для перегляду вмісту каталогів використовується ls (list). Без аргументів команда показує файли та підкаталоги поточного розташування, але додаткові параметри дозволяють отримати значно більше інформації.
ls ls /etc ls -l ls -a ls -lh ls -lt ls -lS ls -ld /etc
Параметр -l активує детальний формат відображення, у якому можна побачити права доступу, власника, групу, розмір і час останньої зміни файлу. Параметр -a додає приховані файли, назви яких починаються з крапки. Варіант -h використовується разом із детальним форматом і показує розміри у зручнішому вигляді, наприклад у кілобайтах або мегабайтах.
Комбінація ls -lah є однією з найкорисніших у щоденній роботі:
ls -lah /etc/ssh
Вона дозволяє швидко оцінити вміст каталогу, включно з прихованими об’єктами, перевірити власників і права доступу. Для DevSecOps така інформація може бути важливою під час первинного аудиту системи.
Ще два параметри, які варто запам’ятати, це -t і -S. Перший дозволяє сортувати записи за часом зміни, а другий за розміром. Наприклад, ls -lt допоможе швидко побачити нещодавно змінені файли, а ls -lS покаже найбільші з них на початку списку.
Коли необхідно переглянути не окремий каталог, а всю структуру проєкту, зручніше використовувати tree. Ця утиліта відображає ієрархію файлів і каталогів у вигляді дерева, що полегшує аналіз складних директорій.
tree tree -L 2 tree -a tree -d tree -I "node_modules"
Наприклад, tree -L 2 обмежує глибину перегляду двома рівнями, а tree -a дозволяє побачити всі файли та каталоги, зокрема приховані, назви яких починаються з крапки, як-от .git або .env. Команда tree -d показує лише каталоги, тоді як tree -I "node_modules" виключає з результатів папку node_modules. Це особливо зручно під час роботи з великими проєктами, де потрібно швидко переглянути структуру каталогів, не відволікаючись на залежності та зайві файли.
В Ubuntu та Debian утиліту за потреби можна встановити командою:
sudo apt install tree
У результаті навіть базові pwd, cd, ls і tree дозволяють орієнтуватися практично в будь-якому Linux-середовищі. Головне – розуміти різницю між абсолютними та відносними шляхами й уважно перевіряти поточний каталог перед виконанням операцій, які змінюють файли.
Під час адміністрування серверів регулярно виникає необхідність знайти конкретний файл. Це може бути конфігурація вебсервера, резервна копія, журнал помилок або об’єкт, який нещодавно з’явився в системі. Якщо точний шлях невідомий, вручну переглядати десятки каталогів незручно, особливо на великих серверах.
Для таких завдань Linux пропонує інструменти find і locate. Обидва дозволяють шукати файли, але працюють за різними принципами.
Команда find виконує пошук безпосередньо у файловій системі. Вона рекурсивно обходить указаний каталог і перевіряє об’єкти відповідно до заданих умов. Пошук можна обмежувати назвою, типом, власником, розміром, правами доступу або часом зміни.
Наприклад, щоб знайти всі файли з розширенням .log у поточному каталозі та його підкаталогах, достатньо виконати:
find . -type f -name "*.log"
Крапка після find означає поточний каталог. Параметр -type f обмежує результати звичайними файлами, а -name визначає шаблон пошуку. Символ * відповідає довільній послідовності символів, тому команда знайде файли з будь-якими назвами, що закінчуються на .log.
Якщо потрібно знайти конфігураційні файли в /etc, змінюємо початковий каталог і шаблон:
find /etc -type f -name "*.conf"
Пошук можна виконувати й від кореня файлової системи, однак це збільшує навантаження та може супроводжуватися помилками доступу. Часто доцільніше обмежити область перевірки каталогами, які справді стосуються завдання.
Одна з найкорисніших можливостей find – пошук за розміром. Наприклад, якщо сервер почав втрачати вільне місце, можна перевірити, чи немає надто великих журналів:
find /var/log -type f -size +100M
Команда знайде звичайні файли, розмір яких перевищує 100 МіБ. Це допомагає виявити журнали, які надмірно розрослися через помилки застосунку, інтенсивний потік подій або неправильні налаштування ротації.
Не менш корисний пошук за часом зміни. Наприклад:
find /etc -type f -mmin -60
Така команда покаже файли в /etc, вміст яких змінювався протягом останніх 60 хвилин. Це може бути корисно, якщо після оновлення чи зміни конфігурації певна служба перестала працювати.
Для пошуку за останню добу використовується -mtime -1:
find /var/log -type f -mtime -1
Тут важливо розрізняти часові характеристики. Параметри -mtime та -mmin стосуються зміни вмісту файлу. Якщо ж потрібно знайти об’єкти за зміною метаданих, наприклад власника або прав доступу, використовують -ctime чи -cmin.
У DevSecOps також може знадобитися перевірка файлів із небезпечними налаштуваннями доступу. Наприклад:
find /etc -type f -perm 0777
Це дозволяє знайти файли, у яких усім категоріям користувачів надано повний набір стандартних прав читання, запису та виконання. Наявність таких файлів не завжди означає компрометацію системи, але є вагомою причиною перевірити, навіщо встановлено настільки широкі дозволи.
Додатково find підтримує виконання команд над знайденими об’єктами за допомогою -exec. Наприклад, можна знайти великі журнали та відобразити їхні розміри:
find /var/log -type f -size +100M -exec ls -lh {} +
Символи {} позначають знайдені шляхи, які передаються наступній команді як аргументи. Такий підхід зручний для діагностики, але потребує обережності, особливо якщо через -exec запускаються операції, що змінюють або видаляють файли.
Для швидкого пошуку за назвою можна використовувати locate. На відміну від find, ця команда не обходить файлову систему під час кожного запиту, а звертається до попередньо створеного індексу. Завдяки цьому результати зазвичай з’являються значно швидше.
locate nginx.conf locate -i readme locate -l 10 "*.log"
Параметр -i вимикає врахування регістру, а -l 10 обмежує кількість результатів першими десятьма збігами.
Недолік такого механізму полягає в тому, що база може не містити нових файлів, створених після її останнього оновлення. Якщо це важливо для поточного завдання, можна оновити індекс вручну:
sudo updatedb
У Debian та Ubuntu для реалізації locate можна використовувати пакет plocate:
sudo apt install plocate
Отже, find доцільно використовувати, коли потрібні актуальні результати та складні умови пошуку. locate підходить для швидкого знаходження відомих назв файлів, якщо припустима залежність від актуальності індексу.
Після того як ми розібралися з навігацією та пошуком, можна переходити до операцій із самими файлами. У Linux більшість стандартних дій, які в графічному середовищі виконуються через файловий менеджер, доступні безпосередньо з термінала.
Для створення каталогів використовується mkdir, а для порожніх файлів – touch. Наприклад, підготуємо невеликий навчальний проєкт із каталогами для конфігурацій, журналів і резервних копій.
mkdir -p ~/linux-lab/config mkdir -p ~/linux-lab/logs mkdir -p ~/linux-lab/backups touch ~/linux-lab/config/app.conf touch ~/linux-lab/logs/app.log
У цьому прикладі параметр -p дозволяє створювати всю послідовність вкладених каталогів, якщо їх ще не існує. Крім того, команда не завершиться помилкою лише через те, що зазначений каталог уже створений.
Саме тому mkdir -p часто використовується у скриптах автоматизації, які можуть запускатися повторно.
Команда touch, своєю чергою, не обмежується створенням порожніх файлів. Якщо файл уже існує, вона зазвичай оновлює його часові мітки, не змінюючи вмісту. Це може знадобитися під час тестування сценаріїв, які залежать від часу модифікації.
Для копіювання файлів використовується cp (copy). Найпростіший варіант передбачає зазначення джерела та нового шляху:
cp ~/linux-lab/config/app.conf ~/linux-lab/backups/app.conf.bak
У результаті в каталозі резервних копій з’явиться окремий файл. Оригінальна конфігурація залишиться на своєму місці, а її копію можна буде використовувати для відновлення після невдалих змін.
Додаткові параметри дозволяють змінювати поведінку копіювання:
cp -r source_dir backup_dir cp -p app.conf app.conf.bak cp -i source.txt destination.txt cp -v source.txt /tmp/
Параметр -r дозволяє копіювати каталоги рекурсивно, включно з вкладеними файлами. Варіант -p намагається зберегти часові мітки, права доступу та власника, наскільки це дозволяють поточні привілеї. Параметр -i запитує підтвердження перед перезаписом, а -v показує виконувані операції.
Під час резервного копіювання конфігурацій іноді важливо зберігати не лише вміст, а й права доступу, символічні посилання та інші метадані. У таких випадках доцільно використовувати cp -a, який призначений для архівного копіювання.
Якщо файл потрібно не скопіювати, а перемістити або перейменувати, використовується mv (move). Одна й та сама команда підтримує обидві операції.
mv old.conf new.conf mv app.log ~/linux-lab/backups/ mv old.conf ~/linux-lab/config/new.conf
У першому прикладі файл перейменовується, у другому переміщується до іншого каталогу, а в третьому обидві дії виконуються одночасно.
На практиці mv часто використовують під час оновлення конфігурацій, розгортання застосунків або організації архівів. Водночас потрібно враховувати, що переміщення може замінити файл призначення. Для додаткового захисту можна застосовувати mv -i, який зазвичай запитує підтвердження перед перезаписом.
Окремої уваги заслуговує команда rm (remove). Вона використовується для видалення файлів і каталогів, проте, на відміну від звичайного файлового менеджера, не переміщує видалені об’єкти до кошика.
rm file.txt rm -i file.txt rm -r old_directory/
Звичайна команда rm видаляє зазначений файл. Параметр -i додає запит підтвердження, а -r дозволяє рекурсивно видаляти каталоги разом з їхнім вмістом.
Особливо обережно потрібно поводитися з комбінацією rm -rf. Параметр -f вимикає частину захисних перевірок і примусово виконує видалення, а -r поширює його на вкладені каталоги. Помилка в шляху або необережне використання змінних у скрипті можуть призвести до втрати великої кількості даних.
На робочих серверах перед масовим видаленням бажано спочатку перевірити список об’єктів, які потрапляють під задані умови, і переконатися в наявності актуальних резервних копій.
Ще одна особливість Linux – можливість створювати різні типи посилань на файли. Для цього використовується команда ln (link).
Жорстке посилання, або hard link, є додатковим ім’ям для того самого файлового об’єкта. Воно посилається на той самий inode, що й початкова назва файлу. Якщо видалити одну назву, дані залишатимуться доступними через інші жорсткі посилання, доки вони існують.
Символічне посилання, або symlink, працює інакше. Воно містить шлях до іншого об’єкта та за своєю логікою нагадує ярлик. Символічні посилання можна створювати як для файлів, так і для каталогів, а також використовувати між різними файловими системами.
Приклади створення:
ln original.txt hardlink.txt ln -s original.txt shortcut.txt ln -s /var/log ~/system-logs
У першому випадку створюється жорстке посилання, у другому символічне посилання на файл, а в третьому посилання на системний каталог журналів.
Щоб перевірити, куди веде символічне посилання, можна скористатися командою:
ls -l ~/system-logs
У результаті буде відображено шлях, на який указує посилання.
Для DevOps символічні посилання особливо корисні під час організації конфігурацій і розгортання програм. Наприклад, вони дозволяють підтримувати стабільний шлях до поточної версії застосунку, навіть якщо фактичні файли зберігаються в каталогах із різними назвами.
У Linux розширення файлу не є обов’язковим і саме собою не визначає його справжній формат. Виконувана програма може взагалі не мати розширення, а файл із назвою document.txt не обов’язково міститиме звичайний текст.
Щоб визначити тип об’єкта за його вмістом, використовується команда file.
file /bin/bash file /etc/passwd file archive.tar.gz file unknown_file
У першому випадку утиліта може визначити виконуваний файл ELF або символічне посилання на нього, залежно від системи та способу виклику. Для /etc/passwd вона зазвичай повідомить про текстові дані, а для архіву визначить відповідний формат стиснення.
Це особливо корисно під час аналізу невідомих файлів. Наприклад, якщо на сервері з’явився підозрілий об’єкт без розширення, команда file допоможе провести первинну класифікацію, не запускаючи його. Водночас результат не є повноцінною перевіркою безпеки: він лише описує ймовірний тип вмісту.
Для перегляду докладних метаданих застосовується stat. На відміну від file, ця утиліта показує характеристики об’єкта у файловій системі: розмір, власника, групу, права доступу, inode, кількість посилань і часові мітки.
stat /etc/passwd
Серед отриманих даних можна побачити три важливі часові характеристики:
Access (atime) – час останнього доступу до вмісту, якщо файлова система веде відповідний облік.
Modify (mtime) – час останньої зміни вмісту файлу.
Change (ctime) – час останньої зміни inode-метаданих або вмісту, але не обов’язково час створення.
Ці характеристики мають значення під час діагностики та розслідування інцидентів. Наприклад, зміна mtime може допомогти визначити, коли редагувався конфігураційний файл. Водночас часові мітки не варто сприймати як беззаперечний доказ певної дії, оскільки їхня точність і поведінка залежать від файлової системи, налаштувань монтування та способу роботи з файлами.
У деяких файлових системах також доступний час створення файлу, який stat може показувати окремо як Birth.
Після пошуку потрібного файлу часто виникає наступне завдання – прочитати його вміст. Це може бути конфігурація служби, системний журнал, список користувачів або результат роботи програми.
Для таких операцій у Linux існує кілька інструментів, кожен із яких підходить для певних ситуацій. Найпростіший варіант – cat (concatenate). Команда читає файли та виводить їхній вміст у стандартний потік виведення, який зазвичай відображається в терміналі.
cat /etc/os-release cat -n /etc/hosts cat file1.txt file2.txt
Перший приклад показує інформацію про встановлений дистрибутив Linux. Другий виводить вміст /etc/hosts із номерами рядків, а третій послідовно відображає два файли.
Команда добре підходить для невеликих конфігурацій і коротких текстових файлів. Однак якщо відкрити через cat журнал на кілька сотень тисяч рядків, увесь його вміст почне виводитися в термінал, що ускладнить перегляд потрібної інформації.
Для великих файлів зручніше використовувати less. Ця утиліта відкриває інтерактивний переглядач, у якому можна переміщуватися текстом, переходити до потрібних рядків і шукати збіги.
less /etc/passwd less -N /var/log/syslog less -S app.log
Параметр -N додає номери рядків, а -S вимикає автоматичне перенесення довгих рядків. Це корисно під час роботи з журналами, де кожен запис може містити багато полів.
Усередині less доступні стандартні клавіші навігації. Space переходить на наступну сторінку, b повертає на попередню, g переміщує до початку файлу, а G – до кінця. Щоб знайти певний текст, достатньо натиснути /, ввести пошуковий запит і підтвердити його клавішею Enter. Для переходу між результатами використовуються n і N, а вихід здійснюється через q.
Схожі можливості має команда more, але її функціональність обмеженіша. Тому для повсякденної роботи з великими текстовими файлами зазвичай зручніше використовувати less.
Якщо повний вміст не потрібен, можна звернутися до команд head і tail. Перша показує початок файлу, а друга – його завершення.
head -n 20 app.log tail -n 50 app.log
Ці приклади виводять відповідно перші 20 і останні 50 рядків. Такий підхід зручний, коли потрібно швидко перевірити структуру файлу або прочитати найсвіжіші записи журналу.
Особливо корисним інструментом під час діагностики є tail -f. Він не завершує роботу після виведення останніх рядків, а продовжує відстежувати файл і показувати нові записи в міру їх появи.
Наприклад, якщо на сервері встановлений Nginx і відповідні журнали зберігаються у стандартному каталозі, можна виконати:
sudo tail -f /var/log/nginx/access.log
Тепер під час надходження HTTP-запитів нові записи з’являтимуться безпосередньо в терміналі. Це дозволяє спостерігати за поведінкою вебсервера, перевіряти надходження запитів і швидко помічати незвичну активність.
Для зупинення режиму відстеження використовується Ctrl+C.
Якщо журнал періодично переміщується або перестворюється внаслідок ротації, замість tail -f часто краще застосовувати tail -F. Цей режим намагається продовжувати стеження за файлом за його назвою, навіть після заміни.
Водночас варто враховувати, що не всі сучасні системи зберігають події виключно у звичайних текстових журналах. У дистрибутивах із systemd значна частина інформації може зберігатися в системному журналі, доступному через journalctl. До детальнішої роботи зі службами та процесами ми повернемося в наступних матеріалах.
Під час роботи з Linux недостатньо знати, де розташований потрібний файл. Не менш важливо вміти швидко знаходити конкретні записи всередині нього, особливо якщо йдеться про великі журнали подій, конфігурації або структуровані текстові дані.
Для цього використовуються grep, awk і sed. Ці інструменти дозволяють фільтрувати інформацію, вибирати окремі поля, обробляти текст і автоматизувати повторювані операції.
Команда grep є одним із найпоширеніших інструментів аналізу тексту в Linux. Вона переглядає вміст файлу або вхідний потік даних і виводить рядки, що відповідають заданому шаблону.
Наприклад, щоб знайти всі повідомлення зі словом error у журналі застосунку, використовується:
grep "error" app.log
За замовчуванням пошук враховує регістр символів. Тому error, Error і ERROR розглядатимуться як різні рядки. Щоб знайти всі варіанти незалежно від регістру, додається параметр -i:
grep -i "error" app.log
Якщо потрібно отримати номери рядків або підрахувати кількість збігів, використовуються параметри -n і -c.
grep -in "error" app.log grep -ic "error" app.log
Другий приклад підраховує кількість рядків, які містять збіг, а не загальну кількість входжень слова. Це важливе уточнення, якщо в одному рядку потрібний текст зустрічається кілька разів.
Інколи необхідно зробити протилежне – виключити певні повідомлення з результату. Наприклад, прибрати всі рядки, у яких зустрічається debug:
grep -v "debug" app.log
Параметр -v інвертує умову пошуку. У результаті будуть показані лише ті рядки, які не відповідають заданому шаблону.
Коли потрібно знайти повідомлення кількох типів одночасно, можна використовувати розширені регулярні вирази через grep -E.
grep -Ei "error|failed|critical" app.log
Така команда знайде рядки, які містять будь-який із трьох зазначених варіантів. Це зручно під час первинного аналізу журналів, коли потрібно швидко зібрати повідомлення про потенційні помилки.
Ще одна корисна можливість grep – перегляд контексту навколо збігу. Наприклад:
grep -C 3 "failed" app.log
Параметр -C 3 виведе по три рядки до та після кожного знайденого збігу. Це дозволяє побачити не лише саме повідомлення про помилку, а й події, які відбувалися безпосередньо перед ним і після нього.
Для окремого керування контекстом використовуються -A (рядки після збігу) та -B (рядки перед збігом).
Команда також підтримує рекурсивний пошук усередині каталогів. Наприклад:
grep -rn "TODO" ~/linux-lab
Цей приклад перевіряє файли у вказаному каталозі та його підкаталогах, знаходить рядки з TODO і показує їхні номери.
Для пошуку лише в певних типах файлів можна використати додаткові обмеження:
grep -rn --include="*.conf" "listen" /etc
Такий підхід дозволяє шукати конкретні параметри у конфігураційних файлах, не переглядаючи весь вміст системних каталогів вручну.
Якщо grep переважно використовується для пошуку рядків, то awk дозволяє працювати з окремими полями всередині них. Це потужний інструмент для обробки текстових таблиць, журналів і файлів із роздільниками.
Принцип його роботи полягає в послідовному читанні рядків, розбитті їх на поля та виконанні заданих дій. За замовчуванням роздільниками виступають пробіли й табуляція, але їх можна змінити.
Наприклад, файл /etc/passwd містить інформацію про локальні облікові записи. Поля кожного запису розділені двокрапками. Щоб отримати лише імена користувачів, можна виконати:
awk -F: '{print $1}' /etc/passwd
Тут -F: задає двокрапку як роздільник, а $1 означає перше поле кожного рядка.
Якщо потрібно одночасно отримати ім’я користувача та його UID:
awk -F: '{print $1, $3}' /etc/passwd
Змінна $3 відповідає третьому полю. Таким чином можна вибирати лише потрібні характеристики, не виводячи весь запис.
awk також підтримує умови. Наприклад:
awk -F: '$3 >= 1000 {print $1, $3}' /etc/passwd
Команда покаже записи, у яких UID не менший за 1000. У багатьох Linux-дистрибутивах такий діапазон використовується для звичайних користувачів, хоча конкретні правила можуть відрізнятися. Тому цей приклад є способом фільтрації за UID, а не універсальним методом точного визначення всіх людських облікових записів.
Окремо awk дозволяє працювати з номерами рядків через змінну NR. Наприклад, можна вивести п’ятий рядок файлу або порахувати загальну кількість рядків:
awk 'NR==5' app.log
awk 'END {print NR}' app.log
Для DevOps і DevSecOps awk особливо корисний, коли потрібно швидко обробити великі текстові набори даних без написання окремої програми. Наприклад, отримати певні поля журналу, підрахувати кількість записів або створити короткий звіт із результатів виконання системної команди.
Третій інструмент, який варто знати, – sed (stream editor). Він призначений для потокової обробки тексту й дозволяє виконувати заміну, видалення, фільтрацію та інші перетворення рядків.
Найпоширеніший сценарій використання sed – автоматична заміна тексту. Наприклад, якщо потрібно змінити значення debug на info у конфігураційному файлі, можна виконати:
sed 's/debug/info/g' app.conf
У цьому прикладі s позначає операцію заміни, а g означає, що замінюватимуться всі входження в кожному рядку.
За замовчуванням sed не змінює оригінальний файл, а лише виводить оброблений текст. Це зручно для перевірки результату перед внесенням фактичних змін.
Щоб записати результат безпосередньо до файлу, використовується параметр -i. Однак працювати з ним потрібно обережно, оскільки невдала заміна може пошкодити конфігурацію або видалити необхідні значення.
Безпечніший варіант для GNU sed передбачає створення резервної копії:
sed -i.bak 's/debug/info/g' app.conf
Після виконання команди файл app.conf буде змінений, а його попередня версія збережеться під назвою app.conf.bak.
Крім заміни тексту, sed дозволяє фільтрувати рядки. Наприклад, можна прибрати з виведення коментарі, які починаються із символу #, або порожні рядки:
sed '/^#/d' app.conf sed '/^$/d' app.conf
У цих прикладах використовується регулярний вираз. Символ ^ позначає початок рядка, $ – його кінець, а d відповідає за видалення рядка з результату обробки.
Також можна вивести лише певний діапазон рядків:
sed -n '10,20p' app.log
Така команда покаже рядки з десятого по двадцятий включно, що може бути зручним під час перевірки конкретного фрагмента журналу або конфігурації.
Справжня перевага командного рядка Linux проявляється тоді, коли різні інструменти використовуються разом. Для цього існує механізм конвеєра, який позначається символом |.
Він дозволяє передавати стандартний вивід однієї команди на стандартний ввід наступної. Завдяки цьому можна будувати послідовності обробки даних без створення проміжних файлів.
Наприклад, припустімо, що нам потрібно перевірити останні 1000 записів журналу та відібрати лише повідомлення про помилки:
tail -n 1000 app.log | grep -i "error"
Спочатку tail отримує завершальну частину файлу, після чого grep відфільтровує рядки за заданим словом.
Якщо необхідно порахувати кількість таких рядків, можна використати:
tail -n 1000 app.log | grep -ic "error"
Або, наприклад, отримати імена користувачів із /etc/passwd, відсортувати їх і показати перші десять:
awk -F: '{print $1}' /etc/passwd | sort | head -n 10
У цьому випадку awk вибирає потрібне поле, sort сортує отриманий список, а head обмежує кількість результатів.
Саме такі комбінації лежать в основі багатьох сценаріїв автоматизації в Linux. Завдяки конвеєрам можна швидко аналізувати системні дані, готувати вибірки та створювати компактні перевірки без складних скриптів.
Водночас слід пам’ятати, що кожна команда має власні обмеження. Наприклад, простий пошук через grep не замінює повноцінного аналізу структурованих JSON-журналів, а обробка логів через awk вимагає розуміння їхнього формату.
Щоб закріпити розглянуті інструменти, створимо невелике навчальне середовище та виконаємо кілька операцій, які нагадують повсякденну роботу адміністратора або DevOps-інженера. Усі наведені нижче дії виконуються всередині домашнього каталогу й не потребують змін у системних конфігураціях.
Спочатку створимо структуру навчального проєкту:
mkdir -p ~/linux-lab/{config,logs,backups}
cd ~/linux-lab
pwd
tree
Після виконання команд ми матимемо окремі каталоги для налаштувань, журналів і резервних копій.
Тепер створимо простий конфігураційний файл:
printf 'mode=debug\nport=8080\n' > config/app.conf
Команда printf формує текст, а символ > перенаправляє його у файл. Якщо файл уже існує, його попередній вміст буде перезаписано, тому цей оператор варто використовувати уважно.
Перевіримо результат:
cat config/app.conf
Маємо отримати:
mode=debug port=8080
Перш ніж змінювати конфігурацію, зробимо резервну копію:
cp -p config/app.conf backups/app.conf.bak
Тепер можна замінити значення режиму роботи застосунку:
sed -i 's/mode=debug/mode=info/' config/app.conf
Перевіримо, чи зміни справді внесені:
grep "mode=" config/app.conf
Очікуваний результат:
mode=info
Далі створимо невеликий тестовий журнал із кількома повідомленнями:
printf '%s\n' \ 'INFO Application started' \ 'INFO Connected to database' \ 'ERROR Connection timeout' \ 'WARNING Retry scheduled' \ 'ERROR Request failed' \ > logs/app.log
Тепер можна потренувати пошук повідомлень про помилки:
grep -n "ERROR" logs/app.log
Команда знайде відповідні рядки та покаже їхні номери. Якщо потрібно дізнатися кількість таких повідомлень:
grep -c "ERROR" logs/app.log
У нашому випадку результатом буде 2.
Нарешті, перевіримо метадані створених файлів:
stat config/app.conf file logs/app.log ls -lah config logs backups
Ці команди покажуть інформацію про конфігурацію, визначать тип журналу та дозволять перевірити структуру створених файлів.
У результаті ми пройшли невеликий, але типовий робочий сценарій: створили структуру проєкту, підготували конфігурацію, зробили резервну копію, змінили налаштування, згенерували журнал і знайшли в ньому повідомлення про помилки.
Саме з таких операцій складається значна частина повсякденної роботи з Linux, хоча в реальних середовищах замість навчальних файлів використовуються конфігурації серверів, журнали застосунків і дані системних служб.
У першій частині серії ми розібрали структуру файлової системи Linux, навчилися переміщуватися між каталогами, створювати, копіювати та видаляти файли, а також знаходити потрібну інформацію за допомогою стандартних інструментів командного рядка.
Окрему увагу приділили роботі із системними журналами та обробці текстових даних через grep, awk і sed. Ці інструменти регулярно використовуються під час діагностики помилок, перевірки конфігурацій, автоматизації завдань і первинного аналізу подій безпеки.
У наступній частині серії «Linux для DevOps і DevSecOps» перейдемо до користувачів і груп, розберемо механізми керування обліковими записами, призначення /etc/passwd та /etc/shadow, а також роботу із sudo. Це допоможе зрозуміти, як Linux організовує доступ до системи та чому правильне керування привілеями є важливою складовою її безпеки.