Модуль 7.2: Обробка тексту
Shell Scripting | Складність:
[MEDIUM]| Час: 30–35 хв
Передумови
Розділ «Передумови»Перед початком цього модуля:
- Обов’язково: Модуль 7.1: Основи Bash
- Обов’язково: Базове розуміння регулярних виразів.
- Бажано: Модуль 6.2: Аналіз логів
Що ви зможете робити після цього модуля
Розділ «Що ви зможете робити після цього модуля»Після завершення цього модуля ви зможете:
- Трансформувати текст за допомогою cut, sort, uniq, tr та paste для аналізу логів
- Написати однорядкові команди awk для вилучення стовпців, фільтрації та обчислень
- Використовувати sed для пошуку й заміни, видалення рядків та редагування файлів на місці
- Побудувати конвеєри обробки тексту, що комбінують кілька інструментів для складних трансформацій
Чому цей модуль важливий
Розділ «Чому цей модуль важливий»Linux — це текстова система. Конфігурації, логи та дані — це майже завжди текст. Майстерне володіння інструментами обробки тексту дозволяє витягувати, змінювати та аналізувати дані без написання повноцінних програм на Python чи Go.
Розуміння обробки тексту допоможе вам:
- Парсити логи — знаходити помилки, патерни та метрики.
- Трансформувати дані — конвертувати конфіги між форматами.
- Обробляти вивід команд — витягувати потрібне з
kubectl,docker,git. - Автоматизувати звіти — створювати зведені таблиці прямо в терміналі.
grep, sed, awk та jq — це швейцарський ніж DevOps-інженера.
grep: Пошук за шаблоном
Розділ «grep: Пошук за шаблоном»grep — ваш основний інструмент для пошуку.
# Знайти рядки з помилкоюgrep "error" file.txt
# Нечутливий до регістру пошукgrep -i "error" file.txt
# Показати номери рядківgrep -n "error" file.txt
# Порахувати кількість збігівgrep -c "error" file.txt
# Тільки назви файлів, де є збігиgrep -l "error" *.logsed: Потоковий редактор
Розділ «sed: Потоковий редактор»sed найкраще підходить для заміни тексту “на льоту”.
# Замінити "old" на "new" у виводіecho "Hello old world" | sed 's/old/new/'
# Замінити ВСІ входження у файлі (global)sed 's/foo/bar/g' file.txt
# Редагувати файл на місці (зберегти зміни у файл)sed -i 's/localhost/127.0.0.1/g' config.txt
# Видалити рядки, що починаються з # (коментарі)sed '/^#/d' file.txtawk: Обробка колонок та полів
Розділ «awk: Обробка колонок та полів»awk — це повноцінна мова для роботи з табличними даними.
# Вивести тільки першу колонку (за замовчуванням роздільник - пробіл)awk '{print $1}' file.txt
# Використати двокрапку як роздільник (для /etc/passwd)awk -F: '{print $1, $6}' /etc/passwd
# Підсумувати значення в другій колонціawk '{sum += $2} END {print "Сума:", sum}' data.txt
# Фільтрація за значенням поляawk '$3 > 100 {print $1}' data.txtjq: Робота з JSON
Розділ «jq: Робота з JSON»В сучасному світі API та Kubernetes JSON є всюди. jq — незамінний інструмент для нього.
# Красиво вивести JSONcat data.json | jq .
# Витягнути конкретне полеecho '{"name": "Ivan", "age": 30}' | jq -r '.name'# Вивід: Ivan (без лапок завдяки -r)
# Робота з масивамиecho '[{"id":1}, {"id":2}]' | jq '.[].id'
# Складний фільтр для Kuberneteskubectl get pods -o json | jq -r '.items[] | select(.status.phase=="Running") | .metadata.name'Тест
Розділ «Тест»-
Як за допомогою
awkвивести останню колонку рядка, якщо кількість колонок невідома?Відповідь
`awk '{print $NF}'`. Змінна `NF` містить кількість полів у поточному рядку. -
Яка команда
sedзамінить всі пробіли на коми у файлі?Відповідь
`sed 's/ /,/g' <файл>`. Прапор `g` (global) обов'язковий для заміни всіх входжень у рядку. -
Як знайти всі рядки, що НЕ містять слово “DEBUG”?
Відповідь
`grep -v "DEBUG"`. Прапор `-v` інвертує пошук. -
Навіщо використовувати
jq -rзамість простогоjq?Відповідь
Прапор `-r` (raw-output) видаляє лапки навколо рядкових значень. Це необхідно, якщо ви хочете передати результат далі в іншу команду або записати в змінну Bash.
Практична вправа
Розділ «Практична вправа»Завдання: Обробити список процесів та знайти “найважчі”.
- Виведіть список усіх процесів, залиште тільки користувача та назву команди:
Terminal window ps aux | awk '{print $1, $11}' | head - Підрахуйте кількість процесів для кожного користувача:
Terminal window ps aux | awk '{print $1}' | sort | uniq -c | sort -rn - Створіть аліас для отримання IP адрес усіх запущених подів (якщо є K8s):
Terminal window kubectl get pods -o json | jq -r '.items[] | "\(.metadata.name) \(.status.podIP)"'
Критерії успіху: Ви вмієте вибирати конкретні поля з виводу команд та проводити їх базову агрегацію.
Підсумок
Розділ «Підсумок»- grep — знайти.
- sed — змінити.
- awk — порахувати та витягнути колонки.
- jq — розібрати JSON.
- Pipes (|) — з’єднати все це в потужний конвеєр.
Далі: Модуль 7.3: Практичні скрипти — навчіться писати надійні скрипти для щоденних задач.