所以我在AIX机器上有一个相当简单的ksh脚本,我公司的用户用它来执行某些任务。每次他们使用脚本时,条目都会放在一个日志文件中,其中包含user id, date,
等信息,以及使用该脚本的确切内容。我需要的是我可以用来从该日志文件中提取的内容,以及过去7天内的所有条目。
日期文件中的日期格式如下:
D=`date "+%m/%d/%C%y%n.
答案 0 :(得分:0)
选项是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
。
答案 1 :(得分:-1)
可能不是很有用的答案,但为什么不写在Unix日志的时间。从1970年1月1日开始的时间以秒为单位。之后的一些报告会更方便。