Обработка текста фильтрами [103.2]

Рейтинг: 74.1% · 11 голосов
Полный курс LPIC-1 (экзамены 101-500 и 102-500): архитектура, загрузка, пакеты, команды и текст, ФС и права, шелл-скрипты, пользователи, сервисы, сеть, безопасность. Debian и RHEL.
Ответить
Аватара пользователя
Sergey_Sysadmin
Сообщения: 134
Зарегистрирован: 11 май 2026, 05:31

Обработка текста фильтрами [103.2]

Сообщение Sergey_Sysadmin »

Оглавление курса (41)
  1. Введение в LPIC-1 и как устроен путь администратора
  2. Железо, устройства и модули ядра [101.1]
  3. Загрузка системы: от BIOS до systemd [101.2]
  4. systemd, цели и уровни выполнения [101.3]
  5. План разметки диска и swap [102.1]
  6. Загрузчик GRUB 2 [102.2]
  7. Разделяемые библиотеки [102.3]
  8. Управление пакетами в Debian: dpkg и apt [102.4]
  9. Управление пакетами RPM, DNF и Zypper [102.5]
  10. Linux как гость виртуализации [102.6]
  11. Командная строка Bash [103.1]
  12. Обработка текста фильтрами [103.2] (вы здесь)
  13. Базовое управление файлами [103.3]
  14. Потоки, конвейеры и перенаправление [103.4]
  15. Процессы: создание, мониторинг, сигналы [103.5]
  16. Приоритеты выполнения процессов [103.6]
  17. Регулярные выражения [103.7]
  18. Редактор vi и vim [103.8]
  19. Разделы и создание файловых систем [104.1]
  20. Целостность и обслуживание ФС [104.2]
  21. Монтирование файловых систем [104.3]
  22. Урок 21. Права доступа и владение: rwx, chmod, umask и специальные биты
  23. Жёсткие и символические ссылки
  24. FHS и поиск файлов в системе [104.7]
  25. Окружение и кастомизация оболочки [105.1]
  26. Урок 25. Написание простых bash-скриптов [105.2]
  27. Графика, рабочие столы и доступность
  28. Учётные записи пользователей и групп
  29. Автоматизация задач: cron, at, таймеры [107.2]
  30. Локализация и интернационализация [107.3]
  31. Системное время и синхронизация [108.1]
  32. Системное логирование [108.2]
  33. Основы почтового агента (MTA) [108.3]
  34. Печать и CUPS [108.4]
  35. Основы интернет-протоколов [109.1]
  36. Постоянная конфигурация сети [109.2]
  37. Диагностика сети [109.3]
  38. DNS на стороне клиента [109.4]
  39. Задачи администрирования безопасности [110.1]
  40. Настройка безопасности хоста [110.2]
  41. Шифрование данных: SSH и GnuPG [110.3]
Урок 11. Обработка текста фильтрами [103.2]

Администратор Linux половину рабочего времени читает текст: логи, конфиги, вывод команд, выгрузки в CSV. Глазами это не осилить, поэтому есть набор маленьких утилит-фильтров, каждая из которых делает ровно одну операцию над потоком строк. По отдельности они примитивны, но соединённые в конвейер превращаются в мощный инструмент разбора данных. В этом уроке разберём классические фильтры из coreutils, научимся собирать их в цепочки и решим типовые задачи: посчитать ошибки в логе, выдрать колонку из таблицы, найти топ IP-адресов.

Изображение

Как это работает

Фильтр - это программа, которая читает стандартный ввод (stdin), как-то его преобразует и пишет в стандартный вывод (stdout). Если файл не указан аргументом, фильтр берёт данные из stdin, поэтому его можно поставить в середину конвейера. Символ вертикальной черты соединяет stdout одной команды с stdin следующей, и данные текут слева направо, строка за строкой, не дожидаясь конца файла.

Большинство фильтров мыслят строками и полями. Строка - это всё до символа перевода строки. Поле - это кусок строки, отделённый разделителем: по умолчанию у cut это табуляция, у sort, awk и подобных - последовательность пробелов и табуляций. Понимание, что считается разделителем в конкретной утилите, важнее знания всех ключей, потому что именно тут чаще всего ломаются конвейеры.

Ключевая идея Unix-философии: не искать одну гигантскую команду, а собрать решение из нескольких простых. Каждый фильтр в цепочке сужает или переформатирует поток, а итог получается комбинацией. Почти все эти утилиты входят в пакет coreutils и ведут себя одинаково на Debian, Ubuntu, RHEL и Fedora - различий между семействами тут почти нет, в отличие от управления пакетами.

Команды и примеры

Просмотр и склейка. cat выводит файлы подряд, tac - в обратном порядке строк (удобно смотреть лог с конца). nl нумерует строки, причём по умолчанию пропускает пустые.

Код: Выделить всё

cat -A file.txt        # показать спецсимволы: $ конец строки, ^I табуляция
tac /var/log/syslog    # последние события сверху
nl -ba script.sh       # пронумеровать ВСЕ строки, включая пустые
Начало и конец. head и tail режут поток по строкам. Современный синтаксис с числом без пробела работает везде.

Код: Выделить всё

head -n 20 access.log      # первые 20 строк
tail -n 50 access.log      # последние 50
tail -f /var/log/nginx/error.log   # следить за дописыванием в реальном времени
journalctl -u sshd | tail -n 100   # хвост лога юнита через systemd
Колонки. cut вырезает поля. Для CSV задайте разделитель ключом -d, для фиксированных позиций - ключ -c.

Код: Выделить всё

cut -d: -f1,7 /etc/passwd        # логин и оболочка
cut -c1-8 /var/log/syslog        # первые 8 символов (метка времени)
echo "a b  c" | cut -d' ' -f2    # ВНИМАНИЕ: cut не схлопывает пробелы
Сортировка и уникальность. sort упорядочивает строки, uniq убирает соседние дубли (поэтому почти всегда идёт после sort). Связка sort | uniq -c | sort -rn - классика для подсчёта частот.

Код: Выделить всё

sort -k2,2 -k3,3n data.txt   # по 2-му полю как текст, затем по 3-му как число
sort -t: -k3 -n /etc/passwd  # разделитель двоеточие, числовая сортировка по UID
sort access.log | uniq -d    # только строки, которые повторяются
Перекодировка символов. tr заменяет или удаляет символы (работает только с stdin). wc считает строки, слова, байты.

Код: Выделить всё

tr 'a-z' 'A-Z' < name.txt       # в верхний регистр
tr -s ' '                       # схлопнуть повторяющиеся пробелы в один
tr -d '\r' < dos.txt > unix.txt # убрать CR из файла с CRLF
wc -l access.log                # число строк
Сборка и форматирование. paste клеит файлы по колонкам, join объединяет два отсортированных файла по общему полю (как JOIN в SQL). fmt переносит абзацы по ширине, expand/unexpand меняют табы на пробелы и обратно, split режет большой файл на куски, od показывает байты.

Код: Выделить всё

paste -d, names.txt ids.txt          # склеить две колонки через запятую
join -t: -1 1 -2 1 users.txt mail.txt  # объединить по первому полю
split -l 100000 huge.log part_        # куски по 100000 строк
od -An -tx1 file.bin | head          # дамп в шестнадцатеричном виде
grep и sed как фильтры. grep оставляет строки по шаблону, sed правит поток на лету.

Код: Выделить всё

grep -i error app.log | grep -v debug      # с ошибками, но без debug
grep -c 'HTTP/1.1" 500' access.log         # сколько раз встретилось
sed -n '10,20p' file.txt                   # вывести только строки 10-20
sed 's/  */ /g; s/^ //' messy.txt          # схлопнуть пробелы, убрать ведущий
Боевой пример - топ-5 IP по числу запросов в логе nginx:

Код: Выделить всё

cut -d' ' -f1 access.log | sort | uniq -c | sort -rn | head -n 5
Частые грабли
  • uniq убирает только СОСЕДНИЕ дубли. Без предварительного sort он пропустит повторы, разбросанные по файлу.
  • cut с разделителем-пробелом не схлопывает их: два пробела подряд дадут пустое поле. Для текста с переменными отступами сначала прогоните через tr -s ' ' или используйте awk.
  • sort по умолчанию сортирует лексикографически: 10 окажется раньше 2. Для чисел нужен ключ -n, для размеров вида 1K, 2M - ключ -h.
  • Локаль ломает порядок: в ru_RU.UTF-8 сортировка может игнорировать регистр и пунктуацию. Для стабильного байтового порядка ставьте LC_ALL=C перед sort.
  • tr читает только stdin, файл аргументом не принимает - пишите tr ... < file, иначе получите ошибку или зависание в ожидании ввода.
  • head -c и tail -c режут по байтам, а не по символам: на UTF-8 можно разрубить букву пополам.
  • Внутри двойных кавычек bash раскрывает переменные и подстановки, поэтому регулярки для sed и grep почти всегда берут в ОДИНАРНЫЕ кавычки.
Мини-лаба
  • Скопируйте свежий лог веб-сервера или возьмите journalctl -u ssh --no-pager > ssh.log.
  • Командой wc -l посчитайте общее число строк в файле.
  • Через grep -c найдите, сколько строк содержат слово Failed или error.
  • Постройте конвейер cut | sort | uniq -c | sort -rn и выведите топ-10 повторяющихся источников (IP или имя юнита).
  • Командой cut выдерните из /etc/passwd логины пользователей с UID >= 1000: подсказка - sort -t: -k3 -n и затем awk или фильтрация.
  • Сделайте из двух файлов (логины и e-mail) одну таблицу через paste и через join, сравните результат.
  • Возьмите файл с CRLF (или создайте printf 'a\r\nb\r\n') и почистите его через tr -d, проверьте результат командой od -c.
Контрольные вопросы
  • Почему uniq без sort часто не находит все дубликаты и как это исправить?
  • Чем отличается вывод sort без ключей от sort -n на строках 2, 10, 1?
  • Как командой cut выбрать второе и седьмое поля из файла /etc/passwd?
  • Какой фильтр и с какими ключами схлопнет повторяющиеся пробелы в один?
  • В чём разница между paste и join при объединении двух файлов?
  • Как одной цепочкой фильтров получить пять самых частых значений первого столбца лога?
👍2 ❤️5 🔥2 😄 🤔
Аватара пользователя
grumpyphoenix
Сообщения: 1
Зарегистрирован: 23 май 2026, 07:26

Re: Обработка текста фильтрами [103.2]

Сообщение grumpyphoenix »

Подскажите, а если в логе разделитель не пробел, а несколько подряд - cut же даст пустые поля. Реально каждый раз через tr -s гонять или проще сразу awk взять?
👍1 ❤️1 🔥 😄 🤔2
Аватара пользователя
pedro36
Сообщения: 1
Зарегистрирован: 23 май 2026, 13:05

Re: Обработка текста фильтрами [103.2]

Сообщение pedro36 »

Дошло наконец зачем sort ставят перед uniq. Я раньше просто uniq на неотсортированном файле звал и удивлялся почему дубли остаются.
👍1 ❤️ 🔥1 😄 🤔
Ответить
← Предыдущая глава
Командная строка Bash [103.1]
Следующая глава →
Базовое управление файлами [103.3]

Все главы курса «LPIC-1: администратор Linux (101 + 102)»

Поделиться темой: ✈ Telegram VK

Вернуться в «LPIC-1: администратор Linux»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость