文本文件的日期范围

问题描述 投票:-1回答:2

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

放置在日志文件中的日期格式如下:

D=`date "+%m/%d/%C%y%n.
date unix ksh
2个回答
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
投票

可能不是非常有用的答案,但是为什么不在Unix时间写日志呢?自1970年1月1日以来经过的时间(以秒为单位)。之后的某些报告将更方便。

© www.soinside.com 2019 - 2024. All rights reserved.