因此,我在AIX机器上有一个相当简单的ksh脚本,我公司的用户可使用该脚本执行某些任务。他们每次使用脚本时,都会在日志文件中放置一个条目,其中包含诸如user id, date,
之类的信息以及他们使用脚本的确切位置。我需要的是可以用来从该日志文件中提取过去7天中所有条目的东西。
放置在日志文件中的日期格式如下:
D=`date "+%m/%d/%C%y%n.
这些选项是AST和GNU实现中可用的ksh93的printf '%(fmt)T
或日期的date -d fmt
。您可以转换为时代秒并相应地过滤日志。
这是一个有趣的,过度设计的示例,没人知道:
#!/usr/bin/env ksh
typeset -T Record=(
integer uid
integer date=0
typeset description
)
typeset -T Log=(
Record -h '(internal) Array of log records.' -a records
typeset -h 'Path to the log file' fileName
typeset -h 'The date format to use for printing' fmt=%m/%d/%C%y
function readLog {
if [[ ! ( -f ${_.fileName} && -r ${_.fileName} ) ]]; then
printf 'Log file: %q not found.\n' "${_.fileName}" >&2
return 1
fi
typeset uid date desc
integer n
while IFS=, read -r uid date desc; do
_.records[n++]=(uid=uid; date=$(printf '%(%s)T' "$date"); description=$desc)
done <"${_.fileName}"
}
function printLastNDays {
if [[ $1 != +([[:digit:]]) ]]; then
printf '%s: Must specify a positive integer of days\n' "${.sh.fun}" >&2
return 1
fi
integer fromTime idx
printf -v fromTime '%(%s)T' "$1 days ago"
for idx in "${!_.records[@]}"; do
((_.records[idx].date > fromTime)) || continue
#printf "UID: %d\nDate: %(${_.fmt})T\nDescription: %s\n\n" \
# "${_.records[idx].uid}" "${_.records[idx].date}" "${_.records[idx].description}"
printf 'UID: %d\nDate: %s\nDescription: %s\n\n' \
"${_.records[idx].uid}" "$(/bin/date -d "@${_.records[idx].date}" "+${_.fmt}")" "${_.records[idx].description}"
done
}
)
function main {
Log myLog=(fileName=/dev/fd/3)
myLog.readLog &&
myLog.printLastNDays 7
}
#typeset -ft main .sh.type.Log.readLog .sh.type.Log.printLastNDays
main "$@" 3<<-'EOF'
123,07/16/2015,foo
124,07/17/2015,bar
125,07/18/2015,baz
126,07/19/2015,bork
EOF
# vim: set fenc=utf-8 ff=unix ft=sh noet :
输出:
UID: 124
Date: 07/17/2015
Description: bar
UID: 125
Date: 07/18/2015
Description: baz
UID: 126
Date: 07/19/2015
Description: bork
[printf
目前是越野车,因此printLastNDays
强制使用/bin/date
。
可能不是非常有用的答案,但是为什么不在Unix时间写日志呢?自1970年1月1日以来经过的时间(以秒为单位)。之后的某些报告将更方便。