UNIX — универсальная среда программирования
UNIX — универсальная среда программирования читать книгу онлайн
В книге американских авторов — разработчиков операционной системы UNIX — блестяще решена проблема автоматизации деятельности программиста, системной поддержки его творчества, выходящей за рамки языков программирования. Профессионалам открыт богатый "встроенный" арсенал системы UNIX. Многочисленными примерами иллюстрировано использование языка управления заданиями
shell.
Для программистов-пользователей операционной системы UNIX.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
$ cat double
awk '
FILENAME != prevfile { # new file
NR = 1 # reset line number
prevfile = FILENAME
}
NF > 0 {
if ($1 == lastword)
printf "double %s, file %s, line %dn" ,$1, FILENAME, NR
for (i = 2; i <= NF; i++)
if ($i == $(i-1))
printf "double %s, file %s, line %dn", $i, FILENAME, NR
if (NF > 0)
lastword = $NF
}' $*
*
$
Операция
++
--
Встроенная переменная
FILENAME
NR
Оператор
if
if (условие)
оператор1
else
оператор2
Если условие верно, то выполняется
оператор1
оператор2
Цикл
for
shell
for (выражение1; условие; выражение2)
оператор
Цикл
for
awk
Выражение1 while (условие) {
оператор
выражение2
}
Например, конструкция
for (i=2; i <= NF; i++)
является циклом с
i
NF
Оператор
break
while
for
continue
while
выражению2
for
next
awk
exit
END
Как и в большинстве языков программирования, в
awk
awk
$ cat backwards
# backwards: print input in backward line order
awk ' { line[NR] = $0 }
END { for (i = NR; i > 0; i--) print line[i] } ' $*
$
Заметьте, что подобно переменным, массивы не нужно описывать; размер массива ограничен только объемом памяти, доступным на вашей машине. Конечно, если очень большой файл заносится в массив, в конце концов, это может привести к исчерпанию ресурсов памяти. Для печати конца большого файла в обратном порядке следует обратиться за помощью к команде
tail
$ tail -5 /usr/dict/web2 | backwards
zymurgy
zymotically
zymotic
zymosthenic
zymosis
$
Команда
tail
lseek
tail
-r
backwards
При обычной обработке входная строка разбивается на поля. Эту операцию можно выполнить с помощью встроенной функции
split
n = split(s, arr, sep)
Строка
s
arr
n
sep
FS
split($0, а, ":")
/etc/passwd
split("9/29/83", date, "/")
$ sed 1q /etc/passwd | awk '{split($0, a, ":"); print a[1]}'
root
$ echo 9/29/83 | awk '{split($0, date, "/"); print date[3]}'
83
$
В табл. 4.5 перечислены встроенные функции
awk
cos(expr) | Косинус expr |
exp(expr) | Возведение в степень expr |
getline() | Чтение следующей входной строки; возвращает 0 в случае конца файла, в противном случае 1 |
index(s1, s2) | Положение строки s2 s1 |
int(expr) | Целая часть expr |
length(s) | Длина строки s |
log(expr) | Натуральный логарифм expr |
sin(expr) | Синус expr |
split(s, a, c) | Разбиение s а[1] a[n] c n |
sprintf(fmt, ...) | Форматирование в соответствии со спецификацией fmt |
substr(s,m,n) | Подстрока в n s m |