Linux awk удалить символ

Приложение B. Маленький учебник по Sed и Awk

В этом приложении содержится очень краткое описание приемов работы с утилитами обработки текста sed и awk. Здесь будут рассмотрены лишь несколько базовых команд, которых, в принципе, будет достаточно, чтобы научиться понимать простейшие конструкции sed и awk внутри сценариев на языке командной оболочки.

sed: неинтерактивный редактор текстовых файлов

awk: язык обработки шаблонов с C-подобным синтаксисом

При всех своих различиях, эти две утилиты обладают похожим синтаксисом, они обе умеют работать с регулярными выражениями, обе, по-умолчанию, читают данные с устройства stdin и обе выводят результат обработки на устройство stdout. Обе являются утилитами UNIX-систем, и прекрасно могут взаимодействовать между собой. Вывод от одной может быть перенаправлен, по конвейеру, на вход другой. Их комбинирование придает сценариям, на языке командной оболочки, мощь и гибкость языка Perl.

Одно важное отличие состоит в том, что в случае с sed, сценарий легко может передавать дополнительные аргументы этой утилите, в то время, как в случае с awk (см. Пример 33-3 и Пример 9-22), это более сложная задача .

B.1. Sed

Sed — это неинтерактивный строчный редактор. Он принимает текст либо с устройства stdin, либо из текстового файла, выполняет некоторые операции над строками и затем выводит результат на устройство stdout или в файл. Как правило, в сценариях, sed используется в конвейерной обработке данных, совместно с другими командами и утилитами.

Sed определяет, по заданному адресному пространству , над какими строками следует выполнить операции. [1] Адресное пространство строк задается либо их порядковыми номерами, либо шаблоном. Например, команда 3d заставит sed удалить третью строку, а команда /windows/d означает, что все строки, содержащие «windows» , должны быть удалены.

Из всего разнообразия операций, мы остановимся на трех, используемых наиболее часто. Это p — печать (на stdout), d — удаление и s — замена.

Таблица B-1. Основные операции sed

Операция Название Описание
[диапазон строк]/p print Печать [указанного диапазона строк]
[диапазон строк]/d delete Удалить [указанный диапазон строк]
s/pattern1/pattern2/ substitute Заменить первое встреченное соответствие шаблону pattern1, в строке, на pattern2
[диапазон строк]/s/pattern1/pattern2/ substitute Заменить первое встреченное соответствие шаблону pattern1, на pattern2, в указанном диапазоне строк
[диапазон строк]/y/pattern1/pattern2/ transform заменить любые символы из шаблона pattern1 на соответствующие символы из pattern2, в указанном диапазоне строк (эквивалент команды tr)
g global Операция выполняется над всеми найденными соответствиями внутри каждой из заданных строк

Без оператора g ( global ), операция замены будет производиться только для первого найденного совпадения, с заданным шаблоном, в каждой строке.

В отдельных случаях, операции sed необходимо заключать в кавычки.

В отдельных случаях, команды редактирования не работают в одиночных кавычках.

Sed использует ключ -e для того, чтобы определить, что следующая строка является инструкцией, или набором инструкций, редактирования. Если инструкция является единственной, то использование этого ключа не является обязательным.

Таблица B-2. Примеры операций в sed

Операция Описание
8d Удалить 8-ю строку.
/^$/d Удалить все пустые строки.
1,/^$/d Удалить все строки до первой пустой строки, включительно.
/Jones/p Вывести строки, содержащие «Jones» (с ключом -n ).
s/Windows/Linux/ В каждой строке, заменить первое встретившееся слово «Windows» на слово «Linux» .
s/BSOD/stability/g В каждой строке, заменить все встретившиеся слова «BSOD» на «stability» .
s/ *$// Удалить все пробелы в конце каждой строки.
s/00*/0/g Заменить все последовательности ведущих нулей одним символом «0».
/GUI/d Удалить все строки, содержащие «GUI» .
s/GUI//g Удалить все найденные «GUI» , оставляя остальную часть строки без изменений.

Замена строки пустой строкой, эквивалентна удалению части строки, совпадающей с шаблоном. Остальная часть строки остается без изменений. Например, s/GUI//, изменит следующую строку

Символ обратного слэша представляет символ перевода строки, как символ замены. В этом случае, замещающее выражение продолжается на следующей строке.

Эта инструкция заменит начальные пробелы в строке на символ перевода строки. Ожидаемый результат — замена отступов в начале параграфа пустыми строками.

Указание диапазона строк, предшествующее одной, или более, инструкции может потребовать заключения инструкций в фигурные скобки, с соответствующими символами перевода строки.

В этом случае будут удалены только первые из нескольких, идущих подряд, пустых строк. Это может использоваться для установки однострочных интервалов в файле, оставляя, при этом, пустые строки между параграфами.

Быстрый способ установки двойных межстрочных интервалов в текстовых файлах — sed G filename.

Примеры использования sed в сценариях командной оболочки, вы найдете в:

Источник

Команда AWK в Linux с примерами

Awk — это язык сценариев общего назначения, предназначенный для расширенной обработки текста. В основном он используется как инструмент отчетности и анализа.

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

В этой статье рассматриваются основы языка программирования awk. Знание основ awk значительно улучшит вашу способность манипулировать текстовыми файлами в командной строке.

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

Существует несколько различных реализаций awk. Мы будем использовать GNU-реализацию awk, которая называется gawk. В большинстве систем Linux интерпретатор awk — это просто символическая ссылка на gawk .

Записи и поля

Awk может обрабатывать текстовые файлы данных и потоки. Входные данные разделены на записи и поля. Awk работает с одной записью за раз, пока не будет достигнут конец ввода. Записи разделяются символом, который называется разделителем записей. Разделителем записей по умолчанию является символ новой строки, что означает, что каждая строка в текстовых данных является записью. Новый разделитель записей может быть установлен с помощью переменной RS .

Записи состоят из полей, разделенных разделителем полей. По умолчанию поля разделяются пробелом, включая один или несколько символов табуляции, пробела и новой строки.

Поля в каждой записи обозначаются знаком доллара ( $ ), за которым следует номер поля, начинающийся с 1. Первое поле представлено с помощью $1 , второе — с помощью $2 и так далее. На последнее поле также можно ссылаться с помощью специальной переменной $NF . На всю запись можно ссылаться с помощью $0 .

Вот визуальное представление, показывающее, как ссылаться на записи и поля:

Программа awk

Чтобы обработать текст с помощью awk , вы пишете программу, которая сообщает команде, что делать. Программа состоит из ряда правил и пользовательских функций. Каждое правило содержит одну пару шаблон и действие. Правила разделяются новой строкой или точкой с запятой ( ; ). Обычно awk-программа выглядит так:

Когда awk обрабатывает данные, если шаблон соответствует записи, он выполняет указанное действие с этой записью. Если у правила нет шаблона, все записи (строки) совпадают.

Действие awk заключено в фигурные скобки ( <> ) и состоит из операторов. Каждый оператор определяет операцию, которую нужно выполнить. В действии может быть несколько операторов, разделенных новой строкой или точкой с запятой ( ; ). Если правило не имеет действия, по умолчанию выполняется печать всей записи.

Awk поддерживает различные типы операторов, включая выражения, условные операторы, операторы ввода, вывода и т. Д. Наиболее распространенные операторы awk:

  • exit — останавливает выполнение всей программы и выходит.
  • next — останавливает обработку текущей записи и переходит к следующей записи во входных данных.
  • print — Печать записей, полей, переменных и настраиваемого текста.
  • printf — дает вам больше контроля над форматом вывода, аналогично C и bash printf .

При написании программ awk все, что находится после решетки (#) и до конца строки, считается комментарием. Длинные строки можно разбить на несколько строк с помощью символа продолжения, обратной косой черты ( ).

Выполнение программ awk

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

При запуске программы в командной строке ее следует заключать в одинарные кавычки ( » ), чтобы оболочка не интерпретировала программу.

Если программа большая и сложная, лучше всего поместить ее в файл и использовать параметр -f для передачи файла команде awk :

В приведенных ниже примерах мы будем использовать файл с именем «team.txt», который выглядит примерно так:

Шаблоны AWK

Шаблоны в awk определяют, следует ли выполнять соответствующее действие.

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

Если у правила нет шаблона, сопоставляется каждая входная запись. Вот пример правила, содержащего только действие:

Программа распечатает третье поле каждой записи:

Шаблоны регулярных выражений

Регулярное выражение или регулярное выражение — это шаблон, который соответствует набору строк. Шаблоны регулярных выражений AWK заключаются в косую черту ( // ):

Самый простой пример — это буквальное сопоставление символа или строки. Например, чтобы отобразить первое поле каждой записи, содержащее «0,5», вы должны выполнить следующую команду:

Шаблон может быть любым типом расширенного регулярного выражения. Вот пример, который печатает первое поле, если запись начинается с двух или более цифр:

Шаблоны реляционных выражений

Шаблоны реляционных выражений обычно используются для сопоставления содержимого определенного поля или переменной.

По умолчанию шаблоны регулярных выражений сопоставляются с записями. Чтобы сопоставить регулярное выражение с полем, укажите поле и используйте оператор сравнения «содержать» (

Например, чтобы напечатать первое поле каждой записи, второе поле которой содержит «ia», вы должны ввести:

Чтобы сопоставить поля, которые не содержат заданного шаблона, используйте оператор !

Вы можете сравнивать строки или числа для таких отношений, как, больше, меньше, равно и т. Д. Следующая команда печатает первое поле всех записей, третье поле которых больше 50:

Шаблоны диапазонов

Шаблоны диапазонов состоят из двух шаблонов, разделенных запятой:

Все записи, начинающиеся с записи, соответствующей первому шаблону, до совпадения с записью, соответствующей второму шаблону.

Вот пример, который напечатает первое поле всех записей, начиная с записи, включая «Raptors», до записи, включающей «Celtics»:

Шаблоны также могут быть выражениями отношений. Приведенная ниже команда распечатает все записи, начиная с той, четвертое поле которой равно 32, до той, четвертое поле которой равно 33:

Шаблоны диапазона нельзя комбинировать с другими выражениями шаблона.

Специальные шаблоны выражения

Awk включает следующие специальные паттерны:

  • BEGIN — используется для выполнения действий перед обработкой записей.
  • END — используется для выполнения действий после обработки записей.

Шаблон BEGIN обычно используется для установки переменных, а шаблон END для обработки данных из записей, таких как вычисления.

В следующем примере печатается «Начать обработку.», Затем печатается третье поле каждой записи и, наконец, «Завершить обработку».

Если программа имеет только шаблон BEGIN , действия выполняются, а ввод не обрабатывается. Если в программе есть только шаблон END , ввод обрабатывается перед выполнением действий правила.

Версия awk для Gnu также включает еще два специальных шаблона BEGINFILE и ENDFILE , которые позволяют выполнять действия при обработке файлов.

Комбинирование узоров

Awk позволяет комбинировать два или более шаблонов, используя логический оператор И ( && ) и логический оператор ИЛИ ( || ).

Вот пример, в котором оператор && используется для печати первого поля той записи, у которой третье поле больше 50, а четвертое поле меньше 30:

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

Awk имеет ряд встроенных переменных, которые содержат полезную информацию и позволяют управлять обработкой программы. Ниже приведены некоторые из наиболее распространенных встроенных переменных:

  • NF — количество полей в записи.
  • NR — номер текущей записи.
  • FILENAME — имя входного файла, который в данный момент обрабатывается.
  • FS — Разделитель полей.
  • RS — Разделитель записей.
  • OFS — Разделитель выходных полей.
  • ORS — разделитель выходной записи.

Вот пример, показывающий, как напечатать имя файла и количество строк (записей):

Переменные в AWK могут быть установлены в любой строке программы. Чтобы определить переменную для всей программы, поместите ее в шаблон BEGIN .

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

По умолчанию значение разделителя полей — любое количество пробелов или символов табуляции. Его можно изменить, установив в переменной FS .

Например, чтобы установить разделитель полей . вы бы использовали:

Разделитель полей также может содержать более одного символа:

При запуске однострочных команд awk в командной строке вы также можете использовать параметр -F для изменения разделителя полей:

По умолчанию разделителем записей является символ новой строки, который можно изменить с помощью переменной RS .

Вот пример, показывающий, как изменить разделитель записей на . :

Действия при отсутствии нагрузки

Действия awk заключаются в фигурные скобки ( <> ) и выполняются при совпадении с шаблоном. Действие может иметь ноль или более утверждений. Несколько операторов выполняются в том порядке, в котором они появляются, и должны быть разделены новой строкой или точкой с запятой ( ; ).

В awk поддерживается несколько типов операторов действий:

  • Выражения, такие как присваивание переменных, арифметические операторы, операторы увеличения и уменьшения.
  • Управляющие операторы, используемые для управления потоком программы ( if , for , while , switch и т. Д.)
  • Операторы вывода, такие как print и printf .
  • Составные утверждения, чтобы сгруппировать другие утверждения.
  • Операторы ввода, чтобы управлять обработкой ввода.
  • Операторы удаления для удаления элементов массива.

Оператор print вероятно, является наиболее часто используемым оператором awk. Он печатает форматированный вывод текста, записей, полей и переменных.

При печати нескольких элементов их нужно разделять запятыми. Вот пример:

Печатные материалы разделяются одиночными пробелами:

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

Печатные элементы объединены:

Когда print используется без аргументов, по умолчанию используется print $0 . Текущая запись будет напечатана.

Чтобы напечатать собственный текст, вы должны заключить текст в двойные кавычки:

Вы также можете печатать специальные символы, такие как новая строка:

Оператор printf дает вам больше контроля над форматом вывода. Вот пример вставки номеров строк:

printf не создает новую строку после каждой записи, поэтому мы используем n :

Следующая команда вычисляет сумму значений, хранящихся в третьем поле в каждой строке:

Вот еще один пример, показывающий, как использовать выражения и управляющие операторы для печати квадратов чисел от 1 до 5:

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

Запустите программу, передав имя файла интерпретатору awk :

Вы также можете запустить программу awk как исполняемый файл, используя директиву shebang и установив интерпретатор awk :

Теперь вы можете запустить программу, введя:

Использование переменных оболочки в программах AWK

Если вы используете команду awk в сценариях оболочки, велика вероятность, что вам потребуется передать переменную оболочки программе awk. Один из вариантов — заключить программу в двойные вместо одинарных кавычек и подставить переменную в программе. Однако эта опция сделает вашу awk-программу более сложной, так как вам нужно будет избежать переменных awk.

Рекомендуемый способ использования переменных оболочки в программах awk — присвоить переменную оболочки переменной awk. Вот пример:

Выводы

Awk — один из самых мощных инструментов для работы с текстом.

Эта статья едва затрагивает поверхность языка программирования awk. Чтобы узнать больше об awk, ознакомьтесь с официальной документацией Gawk .

Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.

Источник

Читайте также:  Как переустановить windows 10 с флешки если компьютер не запускается
Оцените статью