Урок курса

Потоковая обработка (grep, sed, awk)

Bash Linux + Git: от новичка до уверенного пользователя

Потоковая обработка (grep, sed, awk)

Теперь перейдём к инструментам, которые превращают Bash в мощный комбайн по обработке текста. Представь, что у тебя есть куча текстовых данных (файлы логов, списки, таблицы) и тебе нужно найти в них что-то или преобразовать их. Вместо того чтобы открывать файлы вручную и искать глазами, можно поручить эту работу специальным командам.

  • grep – король поиска по тексту. Его имя — это акроним от "global regular expression print", но можно запомнить как "греп – грабли, которые вылавливают нужные строки". Команда grep "ABC" file.txt выведет все строки из file.txt, где встретится подстрока "ABC". Grep ищет иголку в стоге сена за тебя. Ключ -r позволяет искать рекурсивно по всем файлам в папке, а -i — без учёта регистра. Пример: grep -ri "error" /var/log найдёт все упоминания "error" (в любом регистре) во всех файлах внутри /var/log.

  • sed – "stream editor", потоковый редактор. Если grep — это про "найти", то sed — про "найти и изменить". С помощью sed можно производить замены текста по шаблону, вырезать или вставлять строки и многое другое, причём не открывая файл в редакторе. Классический пример: sed -i 's/OLD/NEW/g' file.txt заменит в файле file.txt все вхождения слова "OLD" на "NEW" прямо в файле (-i значит "in-place", т.е. сохранить изменения в самом файле). Здесь s/OLD/NEW/g – это мини-язык sed для замены (substitute). Sed мощный, хотя на первый взгляд выглядит как магия шамана: короткие заклинания внутри кавычек, которые трансформируют текст. Но изучать sed лучше постепенно, по мере необходимости.

  • awk – ещё один мощный инструмент, названный по фамилиям его создателей (Aho, Weinberger, Kernighan). Awk – это целый маленький язык программирования для обработки текстовых данных в табличном виде. Он разбивает строки на поля (по пробелам или другим разделителям) и позволяет делать вычисления и выборку по столбцам. Например, если у тебя есть текстовый файл-таблица с колонками "имя возраст город", то командой awk '{print $1, $3}' people.txt ты выведешь имя и город для каждой строки, игнорируя возраст. Здесь $1 обозначает первое поле, $3 — третье. Awk отлично подходит для извлечения конкретных колонок или агрегирования данных. Он может показаться сложным, но даже базовые вещи (как в этом примере) очень полезны.

Разбор команды grep

Что такое grep?

grep (от англ. global regular expression print) — мощная команда для поиска и фильтрации текста в файлах или потоках данных. Команда ищет строки, соответствующие заданному шаблону (регулярному выражению), и выводит их на экран. Благодаря гибкости шаблонов, grep широко используется для быстрого анализа логов, проверки исходного кода и отладки скриптов.

Основной синтаксис

grep [опции] шаблон [файл ...]
  • шаблон — регулярное выражение или строка, которую необходимо найти.
  • файл — один или несколько файлов, в которых производится поиск. Если файлы не указаны, grep читает данные из стандартного ввода (stdin).

Основные опции

  • -i
    Игнорирует регистр символов при поиске.

    grep -i "error" logfile.txt

    Найдёт строки с "error", "Error", "ERROR" и т.д.

  • -v
    Инвертирует поиск: выводит строки, которые НЕ соответствуют заданному шаблону.

    grep -v "DEBUG" logfile.txt
  • -r или -R
    Рекурсивный поиск по каталогу. Позволяет искать шаблон во всех файлах внутри указанного каталога (и его подкаталогов).

    grep -r "function" src/
  • -n
    Выводит номера строк вместе с найденными строками.

    grep -n "main" program.c
  • -E
    Использует расширенные регулярные выражения (эквивалентно вызову egrep).

    grep -E "cat|dog" animals.txt
  • -F
    Использует поиск по фиксированной строке (без интерпретации символов как метасимволов регулярных выражений), что может ускорить поиск.

    grep -F "http://" links.txt
  • -c
    Выводит только количество строк, соответствующих шаблону.

    grep -c "ERROR" logfile.txt
  • -l
    Выводит только имена файлов, содержащих хотя бы одну строку, соответствующую шаблону.

    grep -l "TODO" *.c

Примеры использования

1. Базовый поиск

grep "main" program.c

Выведет все строки файла program.c, содержащие слово "main".

2. Поиск с игнорированием регистра

grep -i "warning" log.txt

Найдёт все строки, где встречается "warning" в любом регистре (например, Warning, WARNING и т.д.).

3. Вывод с номерами строк

grep -n "function" source.c

Каждая найденная строка будет предваряться номером строки, что помогает быстро ориентироваться в файле.

4. Рекурсивный поиск

grep -r "TODO" .

Поиск всех упоминаний "TODO" во всех файлах текущего каталога и его подкаталогов.

5. Инвертированный поиск

grep -v "^#" config.conf

Выведет все строки из файла config.conf, которые не начинаются с символа # (например, для исключения комментариев).

6. Поиск по фиксированной строке

grep -F "http://" links.txt

Поиск строк, содержащих точную последовательность "http://", без обработки как регулярное выражение.

Полезные советы

  • Комбинирование опций:
    Опции можно комбинировать для более точного поиска. Например, grep -rin "error" /var/log выполнит рекурсивный поиск, проигнорирует регистр и выведет номера строк.

  • Использование в конвейерах:
    grep часто используется вместе с другими командами через пайп, что позволяет фильтровать вывод. Пример:

    dmesg | grep -i "usb"

    Выведет только строки, связанные с USB, из системных сообщений.

  • Регулярные выражения:
    Освоив регулярные выражения, вы сможете создавать гибкие и мощные шаблоны для поиска. Например, шаблон ^Error: найдёт строки, начинающиеся с "Error:".

Разбор команды sed

Что такое sed?

sed (от англ. stream editor) — это мощный редактор потокового текста, позволяющий читать входной поток, выполнять заданные преобразования и выводить результат. sed особенно полезен для автоматизированной обработки текстовых файлов: замены, удаления, вставки и форматирования данных с использованием регулярных выражений.

Основной синтаксис

sed [опции] 'команда' [файл]
  • команда — инструкция (или набор инструкций) для обработки текста. Чаще всего используется команда замены s/шаблон/замена/ и другие команды, такие как d (удаление), p (печать) и т.д.
  • файл — имя файла, который обрабатывается. Если файл не указан, sed читает данные из стандартного ввода (stdin).

Основные возможности и команды sed

Команда замены (s)

Наиболее часто используемая команда в sed — это s, которая заменяет найденный шаблон на заданный текст.

Синтаксис:

s/шаблон/замена/флаги

  • шаблон: Регулярное выражение, определяющее, что искать.
  • замена: Текст, на который будет заменён найденный шаблон.
  • флаги: Дополнительные модификаторы (например, g для глобальной замены всех вхождений в строке, i для игнорирования регистра).

Пример:

sed 's/old/new/g' file.txt

Эта команда заменит все вхождения слова "old" на "new" в каждой строке файла file.txt.

Удаление строк (d)

Команда d удаляет строки, соответствующие шаблону.

Пример:

sed '/^#/d' config.conf

Эта команда удалит все строки, начинающиеся с символа # (часто комментарии).

Печать строк (p)

Команда p выводит строки, соответствующие шаблону. Часто используется вместе с опцией -n, которая подавляет автоматический вывод.

Пример:

sed -n '/error/p' logfile.txt

Эта команда выведет только те строки из logfile.txt, в которых встречается слово "error".

Другие возможности

  • Вставка строк (i, a):
    • i\текст — вставляет строку до текущей.
    • a\текст — вставляет строку после текущей.
  • Изменение строк (c):
    Команда c позволяет заменить целиком строку на заданный текст.
  • Работа с файлами:
    Можно применять sed как фильтр, обрабатывая вывод других команд через конвейеры:

    ls -l | sed 's/ */ /g'

    Это удалит лишние пробелы в выводе команды ls.

Примеры использования

Пример 1: Замена текста в файле

sed 's/foo/bar/g' input.txt > output.txt

В файле input.txt все вхождения "foo" заменяются на "bar". Результат записывается в output.txt.

Пример 2: Удаление комментариев

sed '/^#/d' config.txt > clean_config.txt

Удаляет все строки, начинающиеся с # (комментарии), и сохраняет результат в clean_config.txt.

Пример 3: Изменение только 2-й строки файла

sed '2s/.*/Замена второй строки/' file.txt

Заменяет содержимое второй строки файла на «Замена второй строки».

Пример 4: Выборочная печать строк

sed -n '10,20p' file.txt

Выводит строки с 10-й по 20-ю из файла file.txt.

Полезные советы

  • Регулярные выражения:
    Освоив основы регулярных выражений, вы сможете создавать более сложные и точные шаблоны для поиска и замены.
  • Флаги:
    Флаг g позволяет заменить все вхождения шаблона в строке, а не только первое. Флаг i делает поиск нечувствительным к регистру.
  • Резервное копирование:
    Перед массовыми изменениями полезно сделать резервную копию файла, используя опцию -i.bak, которая сохраняет исходный файл с расширением .bak:
    sed -i.bak 's/foo/bar/g' file.txt
  • Работа в конвейере:
    sed часто используется вместе с другими утилитами в цепочке команд (например, ls, cat, grep) для динамической обработки данных.

Разбор команды awk

Что такое awk?

awk — это язык программирования и утилита для обработки текстовых данных, предназначенная для сканирования входных строк, разбивки их на поля и выполнения над ними действий. Название происходит от фамилий его создателей (Aho, Weinberger, Kernighan). awk широко применяется для извлечения, анализа и преобразования данных, особенно из текстовых файлов, таблиц и логов.

Основной синтаксис

awk 'условие {действие}' [файл ...]
  • условие: Может быть регулярным выражением или логическим выражением для выбора строк. Если условие опущено, действие выполняется для каждой строки.
  • действие: Блок команд, который выполняется для строк, удовлетворяющих условию. Если действие не указано, awk по умолчанию выводит всю строку.
  • файл: Один или несколько файлов для обработки. Если файлы не указаны, awk читает данные из стандартного ввода.

Основные возможности awk

  • Разбиение на поля:
    По умолчанию awk разделяет строки на поля по пробелам и табуляции. Каждое поле можно получить через переменные: $1, $2, ..., а вся строка — $0.

  • Встроенные переменные:

    • NR: номер текущей строки (record number).
    • NF: количество полей в текущей строке.
    • FS: разделитель полей (по умолчанию пробел).
    • OFS: разделитель, используемый при выводе (по умолчанию пробел).
  • Условия и действия:
    awk позволяет выполнять арифметические и логические операции, сравнения, а также использовать циклы и условные конструкции, что делает его полноценным языком программирования для обработки текстов.

  • Форматированный вывод:
    С помощью функции printf можно выводить данные в нужном формате.

Примеры использования

1. Вывод всех строк файла

awk '{print}' file.txt

Выводит каждую строку файла file.txt. Условие отсутствует, поэтому действие выполняется для каждой строки.

2. Вывод первого поля каждой строки

awk '{print $1}' file.txt

Выведет только первое поле каждой строки, что полезно для извлечения данных из таблиц или логов.

3. Вывод строк, где второе поле больше 100

awk '$2 > 100 {print}' data.txt

Для каждой строки файла data.txt, если значение второго поля больше 100, строка выводится на экран.

4. Подсчёт количества строк в файле

awk 'END {print NR}' file.txt

После обработки всех строк блок END выполняется, выводя общее количество строк (NR).

5. Форматированный вывод с помощью printf

awk '{printf "Поле 1: %s, Поле 2: %s\n", $1, $2}' file.txt

Выводит данные в заданном формате: значения первого и второго полей каждой строки.

6. Изменение разделителя полей

Если данные разделены не пробелами, а запятыми, можно установить новый разделитель:

awk 'BEGIN {FS=","} {print $1}' file.csv

Команда задаёт запятую в качестве разделителя полей и выводит первое поле для каждой строки файла file.csv.

Полезные советы

  • Использование BEGIN и END:
    Блок BEGIN выполняется до обработки входных данных, а END — после, что удобно для инициализации переменных или вывода итогов.

  • Регулярные выражения:
    awk позволяет использовать регулярные выражения для отбора строк. Пример:

    awk '/^Error/ {print}' logfile.txt

    Выведет строки, начинающиеся со слова "Error".

  • Комбинирование условий:
    Можно использовать логические операторы (&&, ||) для сложных условий.

    awk '$2 > 100 && $3 == "ACTIVE" {print $1}' data.txt

    Выведет первое поле тех строк, где второе поле больше 100, а третье равно "ACTIVE".

Продолжить с сохранением прогресса

Перейдите к уроку в учебном кабинете.

Перейти к интерактивному уроку