Руководство пользователя для GNU Awk
12. Встроенные функции
12.5 Функции для действий с отметками времени
Обычное назначение awk-программ состоит в обработке регистрационных файлов с информацией о времени выдачи некоторых записей. Многие регистрационные программы записывают отметки времени в формате службы времени, который содержит число секунд, истекших после определенного момента. В системах POSIX это число секунд после полночи на 1 Января 1970, UTC. Чтобы облегчить обработку таких файлов и выдавать удобные отчеты, gawk предлагает две функции для работы с метками времени. Они обе представляют расширение gawk; их нет ни в стандарте POSIX, ни в других известных версиях awk. Необязательные параметры заключены в квадратные скобки ("[" and "]").
systime()
Эта функция возвращает текущее время как число секунд с системного момента. В системах POSIX это --- число секунд с полуночи 1 Января 1970, UTC. Оно может отличаться от других систем.
strftime([format [, timestamp]])
Эта функция возвращает цепочку . Она подобна функции с тем же именем в ANSI C. Время, указанное в timestamp, выдается в этой цепочке согласно формату в format. timestamp имеет тот же формат, что и значение, возвращаемое функцией systime. Если аргумент timestamp присутствует, gawk использует как отметку времени текущее время дня. Если отсутствует аргумент format, то используется "%a %b %d %H:%M:%S %Z %Y". Эта форматная строка выдает результат (почти) эквивалентный результату утилиты date. (Версии gawk до 3.0 требовали аргумент format.) Функция systime допускает сравнение отметки времени из регистрационного файла с текущим временем. В частности, легко определить, как давно некоторая запись была сделана. Она также позволяет вам сделать регистрационную запись, используя формат "seconds since the epoch". Функция strftime позволяет легко переделать отметку времени в удобную для человека форму. Это по своей природе сходно с функцией sprintf (См. раздел 12.3 [Встроенные функции для манипуляций с цепочками, стр. 137), в том, что она копирует буквально неформатные специальные символы в возвращаемую цепочку, подставляя дату и время для форматной обработки в форматную цепочку.
strftime гарантирует по стандарту ANSI C поддержку следующих спецификаций формата даты:
%a Местные сокращения названий дней недели.
%A Полные местные наименования дней недели.
%b Местные сокращения названий месяцев.
%B Полные местные названия месяцев.
%c Местное "принятое" представление даты и времени.
%d День месяца как десятичное число (01-31).
%H Час как десятичное число (24-час. часы) (00-23).
%I Час как десятичное число (12-час. часы) (01-12).
%j День года как десятичное число (001-366).
%m Месяц как десятичное число (01-12).
%M Минута как десятичное число (00-59).
%p Местный эквивалент для обозначения AM/PM для 12-час. часов.
%S Секунды как десятичное число (00-60).5
%U Номер недели в году (первое Воскресенье как первый день недели один)
как десятичное число (00-53).
%w День недели как десятичное число (0-6). Воскресенье как день 0.
%W Номер недели в году (первый Понедельник как первый день недели 1)
как десятичное число (00-53).
%x Местное "принятое" представление даты.
%X Локальное "принятое" представление времени.
%y Год без столетий как десятичное число (00-99).
%Y Год со столетиями как десятичное число (e.g., 1995).
%Z Имя часового пояса или его сокращение или пусто, если зона не указана.
%% Литерал `%'.
Если спецификатор конверсии отличен от указанных, результат не определен.
6 Неформально, "локальный" означает географическое место, где программа должна исполняться. Например, обычный способ сокращения даты September 4, 1991 в Соединенных Штатах есть "9/4/91". Однако в многих странах Европы это будет "4.9.91". Так, спецификация `%x' в "US" регионе может выдавать `9/4/91', в то время как в регионе "EUROPE" она может выдавать `4.9.91'. Стандарт ANSI C определяет по умолчанию регион "C" как типичный для большинства программистов Си.
5 Изредка имеются минуты в году с несколькими секундами, не больше 60.
6 Это происходит потому, что ANSI C оставляет неопределенным поведение Си версии strftime, если она там есть. Обычно спецификатор конверсии или не появляется в возвращаемой цепочке, или появляется буквально.
Публичная Си-версия strftime поставляется c gawk для систем, которые еще не полностью согласованы с ANSI. Если эта версия использована для компиляции gawk (см. приложение B [Установка gawk], стр. 279), то доступны следующие дополнительные спецификации формата:
%D Эквивалент спецификации `%m/%d/%y'.
%e День месяца, пополненный пробелами в случае одной цифры.
%h Эквивалент для `%b'.
%n Символ новой строки (ASCII LF).
%r Эквивалент для `%I:%M:%S %p'.
%R Эквивалент для `%H:%M'.
%T Эквивалент для `%H:%M:%S'.
%t Символ tab.
%k Часы (24-час. часы) как десятичное число (0-23). Одна цифра дополняется
пробелом.
%l Часы (12-час. часы) как десятичное число (1-12). Одна цифра дополняется
пробелом.
%C Столетия как число между 00 и 99.
%u День недели как десятичное число [1 (Понедельник)-7].
%V Номер недели в году (первый понедельник как первый день недели один) как
десятичное число (01-53). Метод вычисления номера недели указан в ISO 8601
(а именно: если неделя, содержащая 1 Января, имеет 4 или более дней в
новом году, то она --- неделя 1, в противном случае это неделя 53 прошлого
года, и только следующая неделя есть неделя 1).
%G Год со столетиями согласно счету недель по ISO как десятичное число.
Например, 1 января 1993 лежит в неделе 53 года 1992. По ISO это еще год
1992, хотя фактически уже 1993. Подобно этому, 31 Декабря 1973 лежит в
в неделе 1 года 1974. Согласно нумерации недель по ISO, это уже
год is 1974, хотя фактически еще 1973.
%g Год без столетий по нумерации недель в ISO как десятичное число (00-99).
%Ec %EC %Ex %Ey %EY %Od %Oe %OH %OI %Om %OM %OS %Ou %OU %OV %Ow %OW %Oy
Это "альтернативные представления" для спецификаций, которые используют только вторую букву (`%c', `%C', и т.д.). Они распознаются и используется их нормальные представления.7 (Это --- средство согласования с утилитами POSIX для обработки дат.)
%v Дата в формате VMS (e.g., 20-JUN-1991). %z Зонное смещение времени в формате +HHMM format (например, этот формат необходим для получения заголовков дат RFC-822/RFC-1036 date headers). Этот пример есть реализация в awk средств обработки дат в POSIX. Нормально утилиты дат печатают текущую дату и время в хорошо известном формате. Но если вы дадите в них аргумент, начинающийся с `+', дата скопирует неформатный символ спецификации и будет интерпретировать текущее время соответственно форматному спецификатору в цепочке.
Например:
$ date '+Today is %A, %B %d, %Y.'
a Today is Thursday, July 11, 1991.
Здесь использована версия gawk для утилит данных. Она имеет оболочечную "добавку" для обработки параметра `-u', который требует, чтобы дата воспринималась так, будто временная зона установлена на UTC.
#! /bin/sh # # date --- аппроксимирует P1003.2 'date' command
case $1 in -u) TZ=GMT0 # use UTC
export TZ shift ;; esac
gawk 'BEGIN -
format = "%a %b %d %H:%M:%S %Z %Y" exitval = 0
if (ARGC ? 2)
exitval = 1 else if (ARGC == 2) -
format = ARGV[1] if (format ~ /^"+/)
format = substr(format, 2) # remove leading + "" print strftime(format)&
exit exitval ""' "$@"
7 Если вы не понимаете что-нибудь из этого, не беспокойтесь; эти средства предназначены для облегчения "интернационализации" программ.
Назад | Вперед
Содержание (общее) | Содержание раздела
Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:
|