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

Обновлено: 04.07.2024

Текст это сердце Unix. Философия "все есть файл" полностью пронизывает всю систему и разработанные для нее инструменты. Вот почему работа с текстом является одним из обязательных навыков не только системного администратора, но и обычного пользователя Linux, который хочет поглубже разобраться в этой операционной системе.

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

Синтаксис команды awk

Сначала надо понять как работает утилита. Она читает документ по одной строке за раз, выполняет указанные вами действия и выводит результат на стандартный вывод. Одна из самых частых задач, для которых используется awk - это выборка одной из колонок. Все параметры awk находятся в кавычках, а действие, которое надо выполнить - в фигурных скобках. Вот основной её синтаксис:

$ awk опции ' условие < действие >'

$ awk опции ' условие < действие >условие < действие >'

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

  • -F, --field-separator - разделитель полей, используется для разбиения текста на колонки;
  • -f, --file - прочитать данные не из стандартного вывода, а из файла;
  • -v, --assign - присвоить значение переменной, например foo=bar;
  • -b, --characters-as-bytes - считать все символы однобайтовыми;
  • -d, --dump-variables - вывести значения всех переменных awk по умолчанию;
  • -D, --debug - режим отладки, позволяет вводить команды интерактивно с клавиатуры;
  • -e, --source - выполнить указанный код на языке awk;
  • -o, --pretty-print - вывести результат работы программы в файл;
  • -V, --version - вывести версию утилиты.

Это далеко не все опции awk, однако их вам будет достаточно на первое время. Теперь перечислим несколько функций-действий , которые вы можете использовать:

  • print(строка) - вывод чего либо в стандартный поток вывода;
  • printf(строка) - форматированный вывод в стандартный поток вывода;
  • system(команда) - выполняет команду в системе;
  • length(строка) - возвращает длину строки;
  • substr(строка, старт, количество) - обрезает строку и возвращает результат;
  • tolower(строка) - переводит строку в нижний регистр;
  • toupper(строка) - переводить строку в верхний регистр.

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

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

  • FNR - номер обрабатываемой строки в файле;
  • FS - разделитель полей;
  • NF - количество колонок в данной строке;
  • NR - общее количество строк в обрабатываемом тексте;
  • RS - разделитель строк, по умолчанию символ новой строки;
  • $ - ссылка на колонку по номеру.

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

Условие позволяет обрабатывать только те строки, в которых содержатся нужные нам данные, его можно использовать в качестве фильтра, как grep. А ещё условие позволяет выполнять определенные блоки кода awk для начала и конца файла, для этого вместо регулярного выражения используйте директивы BEGIN (начало) и END (конец). Там ещё есть очень много всего, но на сегодня пожалуй достаточно. Теперь давайте перейдем к примерам.

Использование awk в Linux

Простейшая и часто востребованная задача - выборка полей из стандартного вывода. Вы не найдете более подходящего инструмента для решения этой задачи, чем awk. По умолчанию awk разделяет поля пробелами. Если вы хотите напечатать первое поле, вам нужно просто использовать функцию print и передать ей параметр $1, если функция одна, то скобки можно опустить:

echo 'one two three four' | awk ''

Да, использование фигурных скобок немного непривычно, но это только в первое время. Вы уже догадались как напечатать второе, третье, четвертое, или другие поля? Правильно это $2, $3, $4 соответственно.

echo 'one two three four' | awk ''

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

echo 'one two three four' | awk ''

Если поля разделены не пробелами, а другим разделителем, просто укажите в параметре -F нужный разделитель в кавычках, например ":" :

echo 'one mississippi:two mississippi:three mississippi:four mississippi' | awk -F":" ''

Но разделитель не обязательно заключать в кавычки. Следующий вывод аналогичен предыдущему:

echo 'one mississippi:two mississippi:three mississippi:four mississippi' | awk -F: ''

Иногда нужно обработать данные с неизвестным количеством полей. Если вам нужно выбрать последнее поле можно воспользоваться переменной $NF. Вот так вы можете вывести последнее поле:

echo 'one two three four' | awk ''

Также вы можете использовать переменную $NF для получения предпоследнего поля:

echo 'one two three four' | awk ''

Или поля с середины:

echo 'one two three four five' | awk ''

Все это можно сделать с помощью таких утилит как sed, cut и grep но это будет намного сложнее.

Как я рассказывал выше, awk обрабатывает одну строку за раз, вот этому подтверждение:

echo -e 'one 1\n two 2' | awk ''

А вот пример фильтрации с помощью условия, выведем только строку, в которой содержится текст one:

echo -e 'one 1\n two 2' | awk '/one/ '

А вот пример использования операций с переменными:

echo -e 'one 1\n two 2' | awk ' END '

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

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

Мы можем подсчитать, что количество переданных байт, это десятое поле. Дальше идёт User-Agent пользователя и он нам не интересен:

cat /var/log/apache2/access.log | awk ''

Вот так можно подсчитать количество байт:

Это только несколько примеров показывающих использование awk в Linux , освоив awk один раз в получите очень мощный и полезный инструмент на всю жизнь.

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

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

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

Записи и поля

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

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

Программа awk

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

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

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

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

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

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

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

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

Шаблоны AWK

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

При запуске однострочных команд 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, ознакомьтесь с официальной документацией Gawk .

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

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

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

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

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

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

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

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

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

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

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

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

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

В данном случае название статьи слегка вводит нас в заблуждение, потому что awk - это больше, чем команда. Это язык программирования со своими собственными правилами. Вы можете писать на нем скрипты для выполнения сложных операций, либо можете просто использовать из командной строки. Его название составлено из заглавных букв Aho, Weinberger и Kernighan (да, тот самый Brian Kernighan), авторов языка, история которого началась в 1977 году. Если вы учитесь или учились программированию на C, то увидите многие похожие концепции в awk. Вам понадобятся определенные знания командной оболочки Linux и, возможно, базовые навыки написания скриптов, что, впрочем, необязательно, так как мы постараемся изложить материал как можно проще. Большое спасибо Arnold Robbins за его работу над awk.

2. Для чего нужен awk?

awk - это утилита/язык для извлечения данных. Именно awk являлся источником вдохновения для Larry Wall, когда он создавал Perl. Для выполнения различных практических задач по обработке текста awk часто используется совместно с sed. В зависимости от поставленной задачи вы можете использовать либо awk, либо Perl, хотя это в большей степени зависит от личных предпочтений. Как и sed, awk читает за один раз одну строку, выполняет определенные действия в зависимости от заданных опций, и выводит результат. Одним из самых простых и популярных способов использования awk является выбор столбца из текстового файла или из вывода другой команды. Когда я устанавливал Debian на свою вторую рабочую станцию, я использовал awk для того, чтобы получить список установленных на первой машине, и скормить его aptitude. Я делал это с помощью команды вида:

В настоящее время большинство менеджеров пакетов предоставляют такую возможность, например это можно сделать с помощью команды rpm's -qa, но вывод содержит больше информации, чем мне нужно. Я вижу, что второй столбец вывода dpkg -l содержит названия установленных пакетов, поэтому я использовал вышеприведенную команду, чтобы извлечь только второй столбец.

3. Базовые концепции

Как уже говорилось, действия, выполняемые awk, заключаются в фигурные скобки, а вся команда - в одинарные кавычки: awk 'condition '. В нашем примере условий нет, но если мы захотим, например, выбрать только установленные пакеты, относящиеся к vim, (да, есть grep, но ведь это пример, кроме того, зачем использовать две утилиты, если можно использовать одну), мы могли мы набрать:

Эта команда выведет все установленные пакеты, содержащие "vim" в названиях. Одна из причин, по которой рекомендуется использовать awk - он быстр. Если заменить "vim" на "lib", в моей системе получится список из более чем 1300 пакетов. Встречаются ситуации, где данных намного больше, и в этих случаях awk показывает все свои преимущества. В любом случае, давайте рассмотрим примеры, которые помогут понять многие аспекты использования программы. Но перед этим будет полезно узнать, что существует несколько диалектов и реализаций awk. Примеры, приведенные в данной статье, относятся к GNU awk (так к реализации, так и к диалекту). Из-за различий в интерпретации кавычек, мы можем использовать bash, ksh или sh, но не можем использовать (t)csh.

Читайте также: