- 9.2. Работа со строками
- 9.2.1. Использование awk при работе со строками
- 9.2.2. Дальнейшее обсуждение
- AWK: Примеры программ
- Способы запуска awk-программ
- Фильтрация строк с помощью awk
- Отбор строк, соответствующих регулярному выражению
- Отбор строк, НЕ соответствующих регулярному выражению
- Отбор строк из заданного диапазона
- Комбинирование условий фильтрации
- Отбор строк по условиям относительно отдельных слов
- Отбор строк на основе числовых характеристик
- Работа со строками в awk
- Форматированный вывод
- Функции преобразования
- Условные конструкции
- Переменные
- Циклы
- Нестандартный разделитель слов
- Комбинирование фильтров и команд печати
- Язык обработки шаблонов AWK
- Структура awk-программы
- Примеры
- END и BEGIN
- Вызов AWK
- Переменные и выражения
- Операции, подобные Си
- Сравнения чисел
- Логические операции
- Примеры awk-программ
- Селекторы
9.2. Работа со строками
Bash поддерживает на удивление большое количество операций над строками. К сожалению, этот раздел Bash испытывает недостаток унификации. Одни операции являются подмножеством операций подстановки параметров, а другие — совпадают с функциональностью команды UNIX — expr. Это приводит к противоречиям в синтаксисе команд и перекрытию функциональных возможностей, не говоря уже о возникающей путанице.
Длина строки
$ <#string>expr length $string expr «$string» : ‘.*’
Пример 9-10. Вставка пустых строк между параграфами в текстовом файле
Длина подстроки в строке (подсчет совпадающих символов ведется с начала строки)
expr match «$string» ‘$substring’
expr «$string» : ‘$substring’
где $substring — регулярное выражение.
Index
expr index $string $substring
Номер позиции первого совпадения в $string c первым символом в $substring.
Эта функция довольно близка к функции strchr() в языке C.
Извлечение подстроки
Извлекает подстроку из $string, начиная с позиции $position.
Если строка $string — » * » или » @ » , то извлекается позиционный параметр (аргумент), [1] с номером $position.
Извлекает $length символов из $string, начиная с позиции $position.
Если $string — » * » или » @ » , то извлекается до $length позиционных параметров (аргументов), начиная с $position.
expr substr $string $position $length
Извлекает $length символов из $string, начиная с позиции $position.
expr match «$string» ‘\($substring\)’
Находит и извлекает первое совпадение $substring в $string, где $substring — это регулярное выражение.
expr «$string» : ‘\($substring\)’
Находит и извлекает первое совпадение $substring в $string, где $substring — это регулярное выражение.
expr match «$string» ‘.*\($substring\)’
Находит и извлекает первое совпадение $substring в $string, где $substring — это регулярное выражение. Поиск начинается с конца $string.
expr «$string» : ‘.*\($substring\)’
Находит и извлекает первое совпадение $substring в $string, где $substring — это регулярное выражение. Поиск начинается с конца $string.
Удаление части строки
Удаление самой короткой, из найденных, подстроки $substring в строке $string. Поиск ведется с начала строки
Удаление самой длинной, из найденных, подстроки $substring в строке $string. Поиск ведется с начала строки
Удаление самой короткой, из найденных, подстроки $substring в строке $string. Поиск ведется с конца строки
Удаление самой длинной, из найденных, подстроки $substring в строке $string. Поиск ведется с конца строки
Пример 9-11. Преобразование графических файлов из одного формата в другой, с изменением имени файла
Замена подстроки
Замещает первое вхождение $substring строкой $replacement.
Замещает все вхождения $substring строкой $replacement.
Подстановка строки $replacement вместо $substring. Поиск ведется с начала строки $string.
Подстановка строки $replacement вместо $substring. Поиск ведется с конца строки $string.
9.2.1. Использование awk при работе со строками
В качестве альтернативы, Bash-скрипты могут использовать средства awk при работе со строками.
Пример 9-12. Альтернативный способ извлечения подстрок
9.2.2. Дальнейшее обсуждение
Дополнительную информацию, по работе со строками, вы найдете в разделе Section 9.3 и в секции, посвященной команде expr. Примеры сценариев:
Источник
AWK: Примеры программ
Утилита awk является примером классического приложения Linux для обработки текста. Она весьма универсальна и эффективна, хоть и не предоставляет полноценный язык программирования. Однако будьте уверены, что ее возможностей вполне хватит для решения многих задач автоматизированной обработки текста (особенно при комбинировании с другими консольными утилитами).
Способы запуска awk-программ
Если awk -программа достаточно простая и короткая, то ее код можно набрать прямо в консоли:
В качестве входных данных для awk можно использовать не только текстовые файлы, но и вывод в стандартный поток других приложений:
В случае, когда код awk -программы достаточно объемный или должен быть сохранен для повторного использования, его можно вызывать из файла с ключом -f :
Для проведения экспериментов используем файл test.cpp , на котором будем проверять результаты работы awk — программ:
Реклама
Фильтрация строк с помощью awk
В первую очередь awk позволяет отбирать строки из текста на основе регулярных выражений и некоторых числовых условий.
Отбор строк, соответствующих регулярному выражению
Например, чтобы получить все строки файла test.cpp , содержащие директиву препроцессора #include , воспользуемся следующей командой:
Регулярное выражение записывается между двумя символами / . В результате получим:
Отбор строк, НЕ соответствующих регулярному выражению
Чтобы оставить все строки, которые не соответствуют регулярному выражению, воспользуйтесь командой из предыдущего подраздела и поставьте в начало awk -кода восклицательный знак. Например, так мы исключим все закомментированные строки:
Вот что осталось:
Отбор строк из заданного диапазона
Определить диапазон строк для вывода на экран можно с помощью двух регулярных выражений, записанных через запятую. В качестве примера найдем определение всех функций, возвращающих int :
Комбинирование условий фильтрации
Для проверки строк сразу по нескольким условиям используйте операторы && (И) и || (ИЛИ) .
Следующая команда выводит все комментарии, которые не содержат main :
Ранее мы искали диапазон строк по двум регулярным выражениям, но если номера строк, которые нужно вывести, известные заранее, то все упрощается:
NR — переменная awk , которая определяет номер строки. Таким образом, представленный код выводит 5-ую и 6-ую строки:
Отбор строк по условиям относительно отдельных слов
Awk может фильтровать текст не только по строкам, но и по отдельным словам. На i -ое слово в строке можно сослаться с помощью $i . Нумерация начинается с единицы, а $0 определяет содержимое всей строки. Количество слов в строке определяется с помощью переменной NF , поэтому $NF указывает на последнее слово. Например, найдем строки, первым словом которых является int или void :
Соответствующий вывод на консоль:
Однако проще использовать проверку по регулярному выражению для слова. Для этого в awk предусмотрен специальный оператор
, который нужно поставить между переменной, указывающей на слово, и регулярным выражением. В качестве примера перепишем предыдущую команду в более компактном виде:
Отбор строк на основе числовых характеристик
В awk доступны арифметические операторы языка C, что открывает свободу действий. Пример ниже выводит все четные строки ( NR — номер строки):
Следующая awk -программа выводит все строки, у которых длина 1-ого слова равна трем:
В результате получаем:
Далее приводится код для вывода строк, состоящих из двух слов ( NF — количество слов в строке):
И соответствующий вывод:
Реклама
Работа со строками в awk
Как вы могли убедиться, awk обладает неплохим набором функций для фильтрации строк текста. Однако для этих строк еще можно выполнять различные преобразования. Команды для работы со строками должны быть обернуты в фигурные скобки < . >. Код в скобках последовательно вызывается для каждой строки обрабатываемого текста.
Форматированный вывод
В awk имеется прямой аналог функции printf() языка C . В качестве примера выведем в начале каждой строки ее номер:
Вот что получили:
Функции преобразования
Кроме printf() есть в awk и другие функции. Например, print() и toupper() :
Условные конструкции
В awk -программах доступны операторы if-else . Например, следующий код выводит без изменения строки, у которых на 1-ой позиции стоит int , а на последней — < , иначе на консоль отправляется --- :
Выполнение кода приводит к выводу следующего:
Переменные
Доступны в awk -программах и переменные, которые не требуется предварительно объявлять. Следующий код для подсчета количества строк и слов в тексте поместим в файл stat.awk :
Тогда его вызов осуществляется следующим образом:
Фильтр END указывает, что код в скобках после него должен выполняться только после прохода всех строк. Доступен в awk и фильтр BEGIN , поэтому в более общем случае программа принимает вид:
Обратите внимание, что посчитать строки и слова в тексте намного проще с помощью wc :
Циклы
В awk -программах вам также доступны циклы for и while в стиле C . Для примера выведем все строки в обратном порядке. Создадим файл reverse.awk следующего содержимого:
Вызовем программу следующий образом:
В результате слова в каждой строке будут выведены в обратном порядке:
Нестандартный разделитель слов
По умолчанию awk в качестве разделителя слов использует пробельные символы, однако такое поведение можно изменить. Для этого воспользуйтесь ключом -F , после которого укажите строку, определяющую разделитель. Например, следующая программа выводит название группы и ее пользователей (если в группе есть пользователи) из файла /etc/group , применяя в качестве разделителя символ двоеточия:
Комбинирование фильтров и команд печати
Все рассмотренные ранее фильтры можно использовать совместно с командами обработки строк. Достаточно записать ограничения перед фигурными скобками. Ниже представлен пример для вывода первых 9 строк вывода команды ps , содержащей информацию о пользователе, идентификаторе процесса и имени команды:
Источник
Язык обработки шаблонов AWK
Название AWK произошло из инициалов его разработчиков: Alfred V. Aho, Peter J. Weinberger и Brian W. Kernighan.
AWK рассматривает входной поток как список записей. Каждая запись делится на поля. На основе этой информации выполняется некоторый определённый программистом алгоритм обработки. По умолчанию разделителем записей является символ новой строки. Разделителем полей — символ пробела или табуляции, или последовательность таких символов. Символы-разделители можно явно определить в программе. Символ-разделитель полей можно определить и в командной строке.
Структура awk-программы
Программа состоит из операторов, имеющих вид:
шаблон — когда выводятся строки с данным шаблоном.
— когда действие выполняется для всех строк.
Действие состоит из последовательности операторов, разделённых точкой с запятой (;), символом перевода строки или закрывающейся скобкой.
Для дальнейших примеров будем использовать файл следующего содержания:
$ cat awk_test Иванов К.И. 1980 50 Петров А.П. 1978 40 Сидоров С.Л. 1979 40 Федоров Л.Е. 1970 65
Примеры
Выводим весь текст
$ awk ‘
Выводим строки в которых встречается сочетание букв ро
$ awk ‘/ро/
$ awk ‘/ро/ <>‘ awk_test Петров А.П. 1978 40 Сидоров С.Л. 1979 40 Федоров Л.Е. 1970 65
END и BEGIN
В AWK есть два оператора специального вида: BEGIN — начальные установки
и
END — действия, выполняемые после обработки последней записи входного потока.
Вызов AWK
Существуют два основных варианта:
Первый awk [-Fc] ‘script.awk’ [файлы]
В этом случае программа заключенная в одинарные кавычки находятся в теле команды
-Fc — флаг, меняющий стандартный разделитель полей на c
файл — имя файла исходных данных, при его отсутствии данные читаются со стандартного входа.
Примеры:
$ cat awk_test | awk ‘/ро/
дают результат, аналогичный
$ awk ‘/ро/
Примеры, демонстрирующие обращение с тазделителями:
В этом примере команда выводит вторые($2) поля строк, содержащих ро
$ awk ‘/ро/
В этом примере программа работает со строками, содержащими число 40, и использует в качестве разделителя полей цифру 9
$ awk -F9 ‘/40/
Флаг -f указывает на awk-скрипт
Переменные и выражения
В языке awk выделяют две группы переменных:
- Предопределенные
- Декларированные в программе.
Исходные значения предопределенных переменных устанавливаются интерпретатором awk в процессе запуска и выполнения awk-программы.
К предопределенным относятся:
Прочим переменным пользователь может присваивать начальные значения. По умолчанию «0» или пустая строка
Типы переменных:
- позиционные
- числа с плавающей точкой
- строка символов
- массив
Интерпретатор awk рассматривает переменную как строковую, пока не возникает необходимость выполнить операции:
- если пробел (конкатенация), то строки;
- если +, то числа с плавающей точкой.
$ awk ‘‘ awk_test 198050 197840 197940 197065 $ awk ‘‘ awk_test 2030 2018 2019 2035 $ awk ‘<> END‘ awk_test 4 $ awk ‘<> END‘ awk_test 4 $ awk ‘<> END‘ awk_test 2 $ awk ‘<> END‘ awk_test 0 $ awk ‘<> END‘ awk_test 4.3
Массив не объявляется, а начинает существовать в момент первого использования. Индекс массива — любое ненулевое значение или строка. Массивы ассоциативные, т.е. не по вычисляемому индексу, а по совпадению содержания, например:
Массивы удобно использовать при суммированиях, например:
$ cat file John 100 Mary 200 Mary 200 John 100 John 300 $ $ awk ‘
Операции, подобные Си
Сравнения чисел
=, >
Если хоть один аргумент — строка, то происходит сравнение строк.
Логические операции
!, ||, &&
Операция пробел — конкатенация.
Примеры awk-программ
Селекторы
Здесь селектор — расширение понятия шаблон, поскольку там где в структуре команды указан шаблон, в общем случае может стоять любой селектор.
ЗАМЕЧАНИЕ — Открывающая скобка действия <должна быть в строке селектора.
В качестве селектора может быть:
выражение
шаблон
0
0
Шаблон может формировать множество образцов или указывать, в каком месте поля искать:
*!G4;:%#`a/ — поле начинается с a
/(72)$/
/нов$/
*!G4;:%#`Ив|дор/
Источник