Чтение онлайн

ЖАНРЫ

Linux и UNIX: программирование в shell. Руководство разработчика
Шрифт:

Представленная ниже команда отображает список файлов текущего каталога (имя файла берется из 9–го столбца), указывая размер каждого из них, а в конце выводит суммарный размер файлов, накопленный в переменной tot:

$ ls -l | awk '/^[^d]/ {print $9"\t"$5; tot+=$5} END {print "total KB: "tot}' dev_pkg.fail 345 failedlogin 12416

messages

4260

зи1од

12810

utap

1856

wtap

7104

total KB: 38791

Если

необходимо включить в список скрытые файлы, следует вместо команду ls -l задать команду 1s -la.

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

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

Таблица 9.3. Встроенные переменные awk

Переменная

Что содержит

ARGC

Количество аргументов в командной строке (поддерживается только: в nawk и gawk)

ARGV

Массив аргументов командной строки (поддерживается только в nawk и gawk)

ENVIRON

Массив переменных среды (поддерживается только в nawk и gawk)

FILENAME

Имя файла, обрабатываемого в текущий момент

FNR

Количество уже обработанных записей в текущем файле (поддерживается только в nawk и gawk)

FS

Разделитель полей во входном потоке (по умолчанию пробел); аналогична опции -F командной строки

NF

Количество полей в текущей записи

NR

Количество обработанных записей во входном потоке

OFS

Разделитель полей в выходном потоке (по умолчанию пробел)

ORS

Разделитель записей в выходном потоке (по умолчанию символ новой строки)

RS

Разделитель записей во входном потоке (по умолчанию символ

новой строки)

Переменная ARGC хранит число аргументов командной строки, переданной сценарию awk (точнее, nawk или gawk, т. к. эта переменная появилась только в новых версиях утилиты). Переменная argv хранит значения аргументов командной строки. Доступ к нужному аргументу осуществляется с помощью ссылки ARGV[n], где п — порядковый номер аргумента в командной строке.

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

ENVIRON["EDITOR"]=="vi"

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

Переменная fnr хранит номер записи, которую утилита awk обрабатывает в текущий момент; ее значение меньше или равно значению переменной NR,

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

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

В переменной ORS хранится разделитель записей в выходном потоке. По умолчанию им является символ новой строки (\n). Переменная RS содержит разделитель записей во входном потоке (в большинстве случаев это тоже символ \n).

Переменные NF, NR и FILENAME

Представленная ниже команда позволяет быстро определить число записей во входном файле grade.txt. Значение переменной NR отображается по завершении обработки файла.

$ awk 'END {print NR}' grade.txt

В следующем примере на экран выводятся все записи исходного файла. Каждой из них предшествуют два числа: количество полей в записи (переменная NF) и номер записи в файле (переменная nr). В самом конце отображается имя входного файла (переменная FILENAME).

$ awk '{print NF, NR, $0} END {print FILENAME}' grade.txt

1

M. Tansley

05/99

48311

Green

8

40

44

2

J. Lulu

06/99

48317

green

9

24

26

3

P. Bunny

02/99

48

Yellow

12

35

28

4

J. Troll

07/99

4842

Brown-3

12

26

26

5

L. Tansley

05/99,

4712

Brown-2

12

30

28

grade.txt

Переменную NF удобно использовать, когда требуется извлечь из путевого имени последнюю часть, т. е. имя файла или каталога. В этом случае необходимо указать, что разделителем полей является символ '/' и использовать ссылку $NF, которая является обозначением последнего поля текущей записи. Например:

$ pwd

/usr/local/etc

$ echo $PWD | awk -F/ '{print $NF}'

Переменная среды $PWD хранит путевое имя текущего каталога.

9.2.10. Встроенные функции работы со строками

Утилита awk располагает набором универсальных функций преобразования строк. В табл. 9.4 перечислены основные из них.

Таблица 9.4. Функции работы со строками

Функция

Назначение

gsub(r,.s)

Выполняет глобальную замену каждой строки, соответствующей регулярному выражению г, строкой s в пределах текущей записи; появилась в nawk

Поделиться с друзьями: