Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Theory regexrp OIB.doc
Скачиваний:
2
Добавлен:
13.07.2019
Размер:
58.37 Кб
Скачать

Varname - имя переменной, в значении которой осуществляется поиск.

Символ-разделитель / можно заменить на любой другой символ, поставив перед ним обратную наклонную черту - \, например:

sed -n '\cREcp' filename

Полный синтаксис и подробное описание редактора sed можно получить выполнив команду man sed.

Краткая информация о метасимволах регулярных выражений редактора sed

^ якорный символ привязки регулярного выражения к началу строки

$ якорный символ привязки регулярного выражения к концу строки

. соответствует одному любому символу

* соответствует нулевому и более количеству повторений символа

[] соответствует одному из перечисленных в скобках символу

[^] соответствует одному из НЕ перечисленных в скобках символу

\< якорный символ привязки регулярного выражения к началу слова

\> якорный символ привязки регулярного выражения к концу слова

\(\) запоминающие скобки

& запоминает всю найденную строку

x\{m,n\} интервал повторения символа (m - минимум, n - максимум)

Полный синтаксис и подробное описание применения регулярных выражений можно получить выполнив команду man regexp и man regex.

Краткая информация о командах редактора sed

a\ добавляет одну или более строк текста к текущей строке

c\ заменяет текст в текущей строке

d удаляет строки

i\ вставляет текст перед текущей строкой

h копирует содержимое буфера редактирования в буфер хранения

H добавляет содержимое буфера редактирования в буфер хранения

g копирует содержимое буфера хранения в буфер редактирования

G добавляет содержимое буфера хранения в буфер редактирования

l вывод непечатных символов

p вывод строк

n читает следующую строку и применяет к ней следующую команду

q выход из редактора sed

r чтение строк из указанного файла

! все строки, не соответствующие указанному диапазону

s подстановка указанной строки вместо искомого текста

Флаги команды постановки

g подстановка вместо каждого искомого вхождения в строке

p вывод строк

w вывод строк в указанный файл

X поменять местами содержимое буферов хранения и редактирования

y трансляция символов (не допускает использования метасимволов)

При множественном применении команд или вложенной адресации диапазонов их группирование осуществляется с помощью фигурных скобок {}. При этом каждая команда должна находиться в отдельной строке, либо заканчиваться символом ; (точка с запятой).

Краткая информация о редакторе awk

 

Семейство утилит awk это потоковые редакторы, имеющие свой собственный язык программирования. Само название составлено из инициалов авторов: Alfred Aho, Brian Kernighan иPeter Weinberger. Nawk это более новая версия редактора, а gawk версия редактора в GNU исполнении для Linux.

 

Все версии утилит awk могут получать данные для обработки из одного или более файлов. Если файлы не указаны, то входные данные берутся со стандартного устройства ввода (stdin) с клавиатуры, или из программного канала конвейера. Программы, написанные на awk, могут быть короткими и умещаться в командной строке, а могут размещаться в отдельных командных файлах, с необязательным указанием в первой строке на версию утилиты, необходимой для выполнения сценария, например: #!/usr/bin/nawk.

 

Допустимы следующие форматы командной строки:

 

nawk 'pattern' filename (или cmd | nawk 'pattern')

nawk '{action}' filename (или cmd | nawk '{action}')

nawk 'pattern {action}' filename (или cmd | nawk 'pattern {action}')

 

Для пояснения принципа работы утилиты awk использован файл employees следующего содержания:

 

% cat employees

Tom Jones             4424    5/12/66                543354

Mary Adams            5346    11/4/63                28765

Sally Chang           1654    7/22/54                650000

Billy Black           1683    9/23/44                336500

 

Команда nawk '/Mary/' employees выводит на экран все строки из файла employees, которые содержат последовательность символов Mary:

 

Mary Adams            5346    11/4/63                28765

 

Команда nawk '{print $1}' employees выводит на экран первое поле каждой строки файла employees.

 

Tom

Mary

Sally

Billy

 

Команда nawk '/Sally/{print $1, $2}' employees выводит на экран первое и второе поле строки файла employees, содержащей последовательность символов Sally. Поля разделены пробелом:

 

Sally Chang

 

Общий принцип работы утилиты awk следующий:

 

Awk получает на вход из файла или программного канала строку и помещает ее во внутреннюю переменную $0. Каждая помещаемая в переменную $0 строка называется в терминологии awk записью и заканчивается символом новой строки.

 

Затем строка разбивается на части, разделителями которых являются по умолчанию символы пробела или табуляции. Эти части строки помещаются во внутренние нумерованные переменные, начиная с $1, и называются полями записи.

 

При выводе с помощью функции print поля отделяются друг от друга пробелом, так как между $1 и $2 стоит запятая. Запятая указывает на необходимость использовать при выводе в качестве разделителя полей содержимое переменной OFS, значением по умолчанию которой является пробел. Функция print воспринимает в качестве аргумента переменные, вычисляемые значения и строковые константы. Последние должны быть заключены в двойные кавычки. Если запятая не используется, то значения будут выведены без разделителя, т.е. соединены друг с другом.

 

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

 

% date

Wed Jul 28 22:23:16 PDT 2004

%

% date | nawk '{print "Month: " $2 "\nYear: " $6}'

Month: Jul

Year: 2004

 

В приведенном выше примере вывод команды date будет направлен на вход утилиты nawk. Второе поле единственной записи будет напечатано после символов "Month: ", затем с новой строки (\n) после символов "Year: " будет напечатано шестое поле. Символ новой строки указан в виде мета последовательности \n. Он необходим только для организации многострочного вывода. Завершающий символ новой строки будет добавлен функцией print автоматически. Можно также указать символ табуляции - \t, возврата курсора - \r или использовать восьмеричный код символа, например: \047 одинарные кавычки (апостроф), и т.д. Если мета последовательность, начинающаяся с символа \, не имеет специального значения, то будет выведен символ, указанный после \, в том числе и символ \, если он был указан как \\.

 

Если при выводе информации необходимо точное форматирование, можно использовать функции printf и sprintf, действие которых аналогично функции printf() языка C. В отличие от функции print функции printf и sprintf не дополняют вывод символом новой строки, по этому его необходимо всегда явно указывать в виде мета последовательности \n.

 

При выводе числовых значений формат вывода можно контролировать с помощью переменной OFMT. По умолчанию ее значение равно "%.6g", что означает печатать шесть символов справа от десятичной точки. Значение этой переменной может быть изменено следующим образом.

 

% nawk  'BEGIN{OFMT="%.2f"; print 1.2456789, 12E 2}'

1.25  0.12

 

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

 

Если программа на языке awk размещается в файле, то имя командного файла указывается в командной строке после ключа -f. Awk считывает строку данных во внутренний буфер и присваивает ее внутренней переменной $0, а ее поля - переменным $1, $2 и т.д. Затем каждая команда из командного файла применяется к находящейся в буфере записи. После того как все команды из командного файла будут выполнены, awk считывает следующую строку во внутренний буфер и, начиная с первой команды, снова выполняет весь командный файл.

 

% cat awkfile

/^Mary/{print "Hello Mary!"}

{print NR, $1, $2, $3}

 

% nawk f awkfile employees

1 Tom Jones 4424

Hello Mary!

2 Mary Adams 5346

3 Sally Chang 1654

4 Billy Black 1683

 

В приведенном выше примере в командном файле awkfile находятся две строки, содержащие действия. Если запись начинается с последовательности символов "Mary", то будет выполнено первое действие - выведена строка символов "Hello Mary!". Для второго действия условия его выполнения не задано, по этому оно будет выполнено для каждой строки обрабатываемого текста, т.е. для каждой записи через пробел будут напечатаны поля $1, $2 и $3. Во встроенной переменной NR в момент выполнения программы хранится номер обрабатываемой записи. По этому в начале каждой строки будет напечатан ее номер. Количество полей записи хранится в переменной NF.

 

Символы разделители полей содержатся во внутренней переменной FS, и могут быть заменены другими, такими как точка с запятой, двоеточие, тире и т.д. Переменную FS можно установить в секции BEGIN командного файла, или с помощью ключа -F в командной строке. Например, для работы с записями файла /etc/passwd в качестве разделителя полей необходимо установить символ двоеточия (:).

 

% nawk F: '/root/{print $1, $7}' /etc/passwd

root /bin/ksh

 

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

 

% nawk F[:/] '/root/{print $1, $9, $10}' /etc/passwd

root bin ksh

 

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

 

% cat info

# My first awk script

# Script name: info; Date: 27.11.2008

#

/Tom/{print  "Tom's birthday is "$4}

/Mary/{print NR, $0}

/^Sally/{print "Hi Sally. " $1, $2 " has a salary of  $" $5 "."}

 

% nawk f info employees

Tom's birthday is 5/12/66

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]