grep и конвейеры
Это самый полезный урок курса. grep и конвейеры каждый день используют, чтобы разобраться в логах и быстро посчитать что-то в CSV.
grep — найти строки
Заголовок раздела «grep — найти строки»grep печатает строки, в которых есть текст:
grep ERROR logs/pipeline.log # строки с ERRORgrep -i error logs/pipeline.log # без учёта регистра: error, Error, ERRORgrep -v INFO logs/pipeline.log # строки БЕЗ INFOgrep -c ERROR logs/pipeline.log # не строки, а их количествоgrep -n ERROR logs/pipeline.log # с номерами строкgrep ERROR logs/*.log # во многих файлах; перед строкой будет имя файлаgrep -h ERROR logs/*.log # во многих файлах, без имени файлаgrep -o "table=[a-z]*" logs/pipeline.log # только совпавший кусок, а не всю строкуТекст для поиска — это регулярное выражение. Пара правил:
.— один любой символ,*— повтор предыдущего символа сколько угодно раз.[a-z]*— сколько угодно маленьких латинских букв.
Если в тексте есть пробел, берите его в кавычки: grep "run failed" logs/pipeline.log.
Конвейер |
Заголовок раздела «Конвейер |»Знак | (pipe) передаёт вывод одной команды на вход другой:
grep ERROR logs/pipeline.log | wc -lgrep нашёл строки с ошибками, wc -l их посчитал. Команд в конвейере может быть сколько угодно. Это главная идея Unix: маленькие программы, которые соединяют вместе.
cut, sort, uniq — посчитать значения
Заголовок раздела «cut, sort, uniq — посчитать значения»cut -d, -f5 data/sales_2024-03.csv # 5-й столбец CSV (разделитель — запятая)sort # отсортировать строкиsort -rn # по числу, по убываниюuniq -c # склеить одинаковые соседние строки и посчитать ихВместе они работают как GROUP BY в SQL:
cut -d, -f5 data/sales_2024-03.csv | tail -n +2 | sort | uniq -ccutберёт столбецstatus.tail -n +2убирает заголовок.sortставит одинаковые значения рядом. Без этогоuniqне сработает.uniq -cсчитает каждое значение.
> и >> — сохранить в файл
Заголовок раздела «> и >> — сохранить в файл»grep ERROR logs/pipeline.log > errors.txt # записать в файл (старое содержимое пропадёт)grep WARN logs/pipeline.log >> errors.txt # дописать в конец файла> перезаписывает файл без вопросов. >> добавляет в конец.
Практика
Заголовок раздела «Практика»Все задания — в папке ~/cli-practice.
Задание 1
Заголовок раздела «Задание 1»Сколько строк с ERROR в логе за март (logs/pipeline.log)?
Проверка: 20.
Решение
grep -c ERROR logs/pipeline.logЗадание 2
Заголовок раздела «Задание 2»В какие дни марта пайплайн упал? Найдите строки run failed и выведите из них только дату — первый столбец, разделитель пробел.
Проверка: 10 дат, от 2024-03-02 до 2024-03-30.
Решение
grep "run failed" logs/pipeline.log | cut -d" " -f1Задание 3
Заголовок раздела «Задание 3»Сколько в мартовском логе строк, где нет INFO? Это все ошибки и предупреждения.
Проверка: 31.
Решение
grep -v INFO logs/pipeline.log | wc -lЗадание 4
Заголовок раздела «Задание 4»Посчитайте заказы марта по статусам.
Проверка:
4 cancelled 22 completed 2 refundedЧисло пробелов перед числами может быть другим.
Решение
cut -d, -f5 data/sales_2024-03.csv | tail -n +2 | sort | uniq -cЗадание 5
Заголовок раздела «Задание 5»Какие типы событий самые частые? Посчитайте события в data/events.csv по типу (3-й столбец) и отсортируйте от большего к меньшему.
Проверка:
5344 page_view2756 click 953 purchase 947 signupРешение
cut -d, -f3 data/events.csv | tail -n +2 | sort | uniq -c | sort -rnЗадание 6
Заголовок раздела «Задание 6»Какая таблица чаще всего ломает загрузку? Найдите строки load failed во всех логах за три месяца: logs/pipeline.log и logs/archive/*.log. Вытащите из них table=... и посчитайте.
Проверка:
9 table=customers 6 table=orders 5 table=eventsРешение
grep -h "load failed" logs/pipeline.log logs/archive/*.log | grep -o "table=[a-z]*" | sort | uniq -c | sort -rnБез -h перед каждой строкой будет имя файла, и uniq посчитает неправильно.
Задание 7
Заголовок раздела «Задание 7»Сохраните все строки с ERROR из трёх логов в файл errors.txt. Потом допишите в конец строку проверено. Сколько строк в файле?
Проверка: 41 строка: 40 ошибок и строка проверено.
Решение
grep -h ERROR logs/pipeline.log logs/archive/*.log > errors.txtecho "проверено" >> errors.txtwc -l errors.txtrm errors.txtДальше: Переменные и PATH.