Урок курса
Потоковая обработка (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.ls -l | sed 's/ */ /g'
Примеры использования
Пример 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".
Продолжить с сохранением прогресса
Перейдите к уроку в учебном кабинете.
