Компьютерные сети и технологии
Привет
Пользователь:

Пароль:



[ ]
[ ]

В сети
Гостей: 9
Участников: 0
На странице: 1
Участников: 3874, Новичок: ritasovurova

Разное

(Занятие 10) awk - язык сканирования и обработки текста
Операционная система UNIX (руководство пользователя)
на Friday 04 August 2006
от список авторов отправить по email статья печатать статья
в Сетевые Операционные Системы ОС > Linux - Unix



10.27. Итоговое краткое описание awk
Командная строка


        awk programm filenames
        awk -f programm-file filenames
        awk -Fs sets field separator to string s
        awk -Ft sets separator to tab


Шаблоны


        BEGIN
        END
        /regular expression/
        relational expression
        pattern && pattern
        pattern || pattern
        (pattern)
        !pattern
        pattern, pattern


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

        if (expr) statement [else statement]
        if (subscript in array) statement [else statement]
        while (expr) statement
        for (expr; expr; expr) statement
        for (var in array) statement
        do statement while statement
        break
        cintinue
        next
        exit [expr]
        return [expr]


Ввод-вывод

close (filename) закрыть файл
getline установить $0 из следующей вводной записи; установить NF, NR, FNR
getline установить $0 из следующей записи файла; установить NF
getline var установить var из следующей вводной записи; установить NR, FNR
getline var установить var из следующей записи файла
print распечатать текущую запись
print expr-list распечатать выражение
print expr-list >file печать выражений в файл
printf fmt, expr-list отформатировать и распечатать
printf fmt, expr-list >file отформатировать и распечатать в файл
system (cmd-line) выполнить команду cmd-line, возвратить состояние


В print и printf >>file добавляется в file и |command - записывает в канал.

Функции

        func name(parameter list) 
        function  name(parameter list) 
        function-name(expr, expr, ...)


Функции строки

gsub(r,s,t) заменить строку s для каждого найденного регулярного выражения r в строке t; возвращает количество замен; если t опущено, то используется $0
index(s,t) возвращает индекс строки t в строке s, или 0, если нет вхождений строки t
length(s) возвращает длину строки s
match(s,r) возвращает позицию s, в которой встретилось регулярное выражение r; возвращает 0, если r не найдено
split(s,a,r) разбить строку s в массив a по регулярному выражению r; возвращает количество полей; если r опущено, то используется значение FS
sprints(fmt,expr-list) печатает expr-list в соответствии с fmt, возвращает результирующую строку
sub(r,s,t) аналогично gsub, за исключением того, что заменяется только первая найденная подстрока
substr(s,i,n) возвращает подстроку n, начинающуюся с i; если n опущено, то используется остаток s


Арифметические функции

atan2(y,x) арктангенс y/x в пределах от "-пи" до "пи"
cos(x) косинус x
exp(x) экспоненциальная функция x
int(x) целая часть x с усеченными лидирующими нулями
log(x) натуральный логарифм x
rang() случайное число между 0 и 1
sin(x) синус x
sqrt(x) квадрат x
srand(x) x - новое начальное значение для rand()


Операторы

= += -= *= /= %= ^= присвоение
?: условное выражение
|| логическое OR
&& логическое AND
~ !~ поиск регулярного выражения; отрицательный поиск
< <= > >= != == отношения
blank конкатенация строк
+ - сложить, вычесть
* / % умножить, разделить, режим
+ - ! унарный плюс, унарный минус, логическое отрицание
^ показательная функция ( ** является синонимом)
++ -- приращение, отрицательное приращение
$ поле


Регулярные выражения

с поиск на совпадение с немета-символом "c"
поиск буквенного символа "с"
^ поиск начала строки или последовательности строк
$ поиск конца строки или последовательности строк
. поиск любого символа, кроме символа новой строки
[s] поиск любого символа из набора "s"
[^s] поиск любого символа, отличного от "s" и символа новой строки
r* поиск ноль или больше
r+ поиск одного или больше
r? поиск ноль или один
(r) группирование: поиск r
r1r2 конкатенация: поиск r1 затем r2
r1|r2 поиск либо r1 либо r2


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

ARGC число аргументов командной строки
ARGV массив аргументов командной строки
FILENAME имя текущего вводного файла
FNR номер записи в текущем файле
FS разделитель поля вводного файла; (по умолчанию - пробел)
FN число полей в текущей записи
NR число считанных на данный момент записей
OFMT выводной формат для цифр; (по умолчанию - %6.g)
OFS разделитель поля выводного файла
ORS разделитель записи выводного поля
RS разделитель записи вводного файла
RSTART индекс первого выбранного символа при помощи match(); 0 - если символ не найден
RLENGTH длина строки, выбранной при помощи match() -1 - если строка не найдена
SUBSEP разделитель индексов элементов массива; (по умолчанию - \034)


10.27.1. Ограничения

При работе с awk вы должны придерживаться следующих ограничений:

100 полей
2500 символов во вводной записи
2500 символов в выводной записи
1024 символов в индивидуальном поле
1024 символов в строке printf
400 символов в строке, заключенной в кавычки
400 символов в классе символов
15 открытых файлов
1 канал


10.27.2. Инициализация, сравнение и тип приведения

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

    var = expr 

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

    v1 = v2

то типом v1 становится тип v2. При сравнении, если оба операнда являются цифровыми, то производится цифровое сравнение. В противном случае, операнды рассматриваются как строковые и сравнение производится над строками. Тип любого выражения может быть приведен к цифровому таким образом:

    expr + 0

и к строковому типу:

    expr ""

(это конкатенация с пустой строкой)

Инициализированные переменные имеют цифровое значение 0, а строковые - значение "". Соответственно, если x проинициализировано, то оператор

    if (x) ...
имеет значение "ложь", а 

        if (!x) ...
        if (x == 0) ...
        if (x == "") ...
все являются истиной, но 

        if (x == "0") ...
является ложью. 


Тип поля определяется по контексту. Например:

    $1++
означает, что $1 будет цифровым, и 

    $1 = $1 "," $2

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

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

    if ($1 == $2) ...

тип поля определяется при вводе.

Поля, которые являются нулевыми, имеют строки со значением "", они не являются цифровыми.

Определения типов для элементов массива, созданных split(), аналогичны определению типов для полей.

Так, если arr[i] не существует, то :

if (arr[i]
 == "") ...

приводит к тому, что он появляется со значением "".


Поиск Компьютерные сети и технологии

Copyright © 2006 - 2020
При использовании материалов сайта ссылка на xnets.ru обязательна!