从文本文件中抓取日期范围

时间:2015-07-16 09:11:06

标签: date unix ksh

所以我在AIX机器上有一个相当简单的ksh脚本,我公司的用户用它来执行某些任务。每次他们使用脚本时,条目都会放在一个日志文件中,其中包含user id, date,等信息,以及使用该脚本的确切内容。我需要的是我可以用来从该日志文件中提取的内容,以及过去7天内的所有条目。

日期文件中的日期格式如下:

D=`date "+%m/%d/%C%y%n.

2 个答案:

答案 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日开始的时间以秒为单位。之后的一些报告会更方便。