What is sed and awk in linux

What is sed and awk in linux

Команда имеет формат:

Команда копирует файлы (по умолчанию со стандартного входа) на стандартный выход, редактирует их в соответствии со своими(!) командами, размещенными в «script» (в командном файле или строке редактора [а не shell!]). По флагу «-f» берет берет файл команд из файла «sfile»; Если есть только опция «-e script», то флаг «-e» можно опустить. Флаг «-n» подавляет вывод (происходящий по умолчанию). «script» состоит из команд редактирования, по одной в строке, имеющих формат:

«sed» циклически преобразует входные строки в выходные.

Адреса «[ addr [ , addr ] ]» — это либо номера строк, либо последняя строка (символ «$»), либо регулярные выражения в стиле редактора «ed»:

  • «\» используется в многострочных командах для экранирования продолжения строки.
  • «.» совпадает с любым символом.
  • Если адреса не указаны — просматриваются все входные строки.
  • Если один адрес, то выбираются совпадающие строки.
  • Если заданы два адреса, выбираются строки в заданном интервале.
  • «!cmd» выполняется команда «cmd», для строк, которые не были выбраны по адресам.

Для следующих (основных) функций (команд) максимальное число допустимых адресов указано в скобках.

(1)a\ text Добавляет text после указанной строки

Команда: Результат: Пример: Результат:

(2)b label Осуществляет переход к команде («cmd») «label:cmd». Если метка («label») отсутствует, то переход на конец командного файла.

(2)c\ text Удаляет выбранные строки и заменяет их на «text’.

(2)d Удаляет найденные строки

(1)i\ text Вставляет «text» на место выбранной строки. (сравните с «a\»)

(2)p Выводит найденные строки (используется с флагом «-n»).

(1)q Выходит из «sed».

(2)r rfile Читает файл «rfile» и выдает на выход.

(2)s/reg_expr/rpl/flags Заменяет регулярное выражение «reg_expr» на «rpl» с учетом флагов «flags»:

g глобально (по всей строке)
p выводить замены
w wfile сохранять заменяемое в «wfile».

Пример: Результат:

(2)y/str1/str2/ Заменяет все вхождения символов «str1» соответствующими символами «str2». Длины строк должны быть одинаковыми.

(2)! Cmd Команда(ы) «cmd» применяются к невыбранным строкам.

(1)= Выдает номера строк.

(2) Скобки группируют команды.

II. Язык обработки шаблонов awk

awk — команда контекстного поиска и преобразования текста. Она — фильтр. Ее можно рассматривать как оболочку «awk» в оболочке «shell».

1. Структура awk-программы

Программа состоит из операторов (правил), имеющих вид:

Частные случаи:

  • <действие>— когда действие выполняется для всех строк.
  • шаблон — когда выводятся строки с данным шаблоном.

Действие может состоять из последовательности операторов, разделяемой «;» или переводом строки или закрывающей скобкой.

Возможны комментарии (как в shell «#. «).

Пример:
Для дальнейших примеров возьмем входной файл «f-awk» ( фамилия инициалы год-приема-на-работу возраст ):

Иванов И.И. 1980 50
Петров А.В. 1979 40
Сидоров С.К. 1979 40
Хведоров И.Х. 1970 60
Результат:

Существует два оператора специального вида («BEGIN»-начальные установки и «END» — «последействия»):

2. Вызов awk

Возможны два основных варианта:

Это простейший случай, когда программа (заключенная в кавычки » ‘ «) находится в теле команды, «-Fc» — флаг, меняющий стандартный разделитель полей на «c» «file» — имя файла исходных данных, при его отсутствии — со стандартного входа. (Этот формат использован в начальных примерах).

дают результат, аналогичный

Для демонстрации действия флага «-Fc» рассмотрим вызовы:

Первая команда «awk» выведет вторые поля (благодаря позиционной переменной «$2») строк, содержащие «до». (Кстати, позиционная переменная «$0» соответсвует всей строке). Во втором случае, благодаря флагу «-F» стандартные разделители заменены на символ «0», т.е. теперь выбранные строки воспринимаются, как разбитые на следующие поля:

Флаг «-f» говорит о том, что awk-программу надо брать из файла, имя которого указано следом (имя может быть произвольным и расширение «.awk» добавлено здесь просто из эстетических соображений).

3. awk-переменные и выражения

В языке awk выделяются две группы переменных: предопределенные и декларированные в программе. Исходные значения предопределенных переменных устанавливаются интерпретатором awk в процессе запуска и выполнения awk-программы.

К предопределенным относятся: Умолчания:
NR — номер текущей строки
NF — число полей в текущей строке
RS — разделитель строк на вводе «\0»
FS — разделитель полей на вводе пробел и/или табуляция
ORS — разделитель строк на выводе RS
OFS — разделитель полей на выводе FS
OFMT — формат вывода чиcл «%.6g»
FILENAME — имя входного файла.

Прочим переменным пользователь может присваивать начальные значения. По умолчанию «0» или пустая строка (что здесь равнозначно!).

Типы переменных:

  • позиционные,
  • числа с плавающей точкой,
  • строка символов,
  • массив.

Интерпретатор awk рассматривает переменную как строковую, пока не возникает необходимость выполнить операции:

  • если пробел (конкатенация), то строки;
  • если «+», то числа с плавающей точкой.

Примеры: Результат: Результат:

Массив не об’является, а начинае существовать в момент первого использования. Индекс массива — любое ненулевое значение или строка. Массивы ассоциативные, т.е. не по вычисляемому индексу, а по совпадению содержания, например:

Массивы удобно использовать при суммированиях, например записи выплат имеют вид (файл «p-1»):

Результат (поименный нарастающий итог):

Операции как в Си =, +=, -=, *=, /=, %=, +, /, %, ++, —.
Сравнения чисел, если оба числа, иначе — строк =, >
Логические операции !, ||, &&
Операция «пробел» конкатенация.

4. Примеры awk-программ

Значение позиционной переменной»пусто» (после окончания просмотра)

5. Селекторы

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

Замечание. Открывающая скобка действия «<" должна быть в строке селектора.

В качестве селектора может быть:

  1. выражение;
  2. шаблон;
  3. их комбинация.

Соответствующие примеры: Пример:

3) Шаблон может формировать множество образцов или указывать, в каком месте поля искать:

/^a/ поле начинается с «a»
/a$/ поле кончается «a»
\+ экранирует оператор
[abc] любой из символов «a», «b» и «c»
[a-р] любой символ диапазона
* 0 или больше вхождений регулярного выражения
+ 1 или больше вхождений регулярного выражения
? 0 или 1 вхождение регулярного выражения
ab|cd «ab» или «cd»

Примеры сочетаний: Результат:

То есть в третьем поле выделить 70-е годы (7 и еще одна цифра от конца поля).

6. Еще примеры

7. Действия

В awk возможны следующие действия:

  1. присваивания выражений;
  2. операторы управления
  3. операторы вывода;
  4. встроенные функции.

Операторы управления

exit завершить выполнение программы;
next перейти к следующей строке, управление на начало awk-программы;
break выход из цикла;
continue переход к следующей итерации;

Структурные операторы

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

Примеры Результат: Результат:

Здесь, кроме изменения очередности полей в строке на противоположное (что делает цикл «for»), предварительно устанавливается выходной разделитель — пробел и весь результат предварительно выдается в одну строку, поэтому после обработки каждой строки выдается команда «print RS» для перевода выходной строки. Редактор «sed» подключен через конвейер, чтобы убрать возможные пробелы в начале строки. Существенная деталь. Если запустить лишь базовую структуру

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

Однако, если поставим «;» сразу после условия, т.е. сделаем пустое тело цикла, за пределы которого вынесен «print $k»

то получим исходную таблицу

поскольку «$k» после выхода из цикла будет иметь значение «0», а «$0» — соответсвует всей строке в качестве значения(!), то «print $k» будет после каждого цикла печатать полные строки.

8. Ввод и вывод данных

В общем случае в команде awk может быть указано несколько файлов. Напомним форматы вызова команды:

Файлы обрабатываются последовательно в указанном порядке. Это можно использовать для «настройки» awk команды при обработке последующих файлов.

Пусть файл «f0» имеет вид:

А файл awk-программы «prim.awk» имеет вид:

Тогда при вызове команды Результат:

То есть второе поле файла «f0» дает значение переменной «w1», а первое — «w2». Эти переменные используются в селекторах при обработке файла «f-awk».

Изменим программу в файле «f-awk»: Результат:

Если исключить первый оператор «next», то в выходном файле появится дополнительно первая строка:

поскольку выбирается снова первое поле в певом файле («f0»). Если исключить и второй «next», то в выходном файле появится дополнительно последняя строка:

которая ранее не выводилась, так как в предшествующий оператор » < print ("фамилия: "$1)>» заканчивал работу на ПОСЛЕДНЕЙ строке файла «f-awk», поэтому «next» пропускал последующую командную строку

И еще одна модификация в связи с вводом данных с терминала. Вызов команды будет:

А файл «prim.awk» примет вид:

9. Встроенные функции

sin (expr) синус expr
cos (expr) косинус expr
exp (expr) возведение в степень expr
log (expr) натуральный логорифм expr
sqrt (expr) извлечение корня expr
int (expr) целая часть числа
length (s) длина строки s
printf (fmt, . ) форматирование (аналогично Си) по спецификации fmt.
substr (s, m, n) подстрока в n символов строки s, начинающаяся с m.
getline () чтение следующей строки.
0 конец файла, иначе 1.
index (s1, s2) номер позиции, с которой s1 совпадает с s2, иначе 0.
split (s, M, c) строка s разбивается элементы массива M по разделителю c (по умолчанию FS=» «); функция возвращает число полей.

Здесь поля разделяются по «.», выбираются строки у которых длина первого поля больше 8-ми, и их длина «length ($1)» печатается перед строкой «$0». Результат: Результат:

Источник

Приложение 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 в сценариях командной оболочки, вы найдете в:

Источник

Читайте также:  Сетевой принтер windows server 2012
Оцените статью