2015-07-16 1 views
-1

J'ai donc un script ksh assez simple sur une machine AIX que les utilisateurs de mon entreprise utilisent pour effectuer certaines tâches. Chaque fois qu'ils utilisent le script, une entrée est placée dans un fichier journal contenant des informations telles que user id, date, et exactement ce à quoi ils ont utilisé le script. Ce dont j'ai besoin, c'est quelque chose que je peux utiliser pour tirer de ce fichier journal, toutes les entrées des 7 derniers jours.Saisir la plage de dates à partir du fichier texte

La date qui est placé dans le fichier journal est formaté comme suit:

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

Répondre

-1

peut-être pas de réponse très utile, mais pourquoi ne pas pourquoi écrire dans le temps Unix journal. Le temps en secondes écoulé depuis le 1er janvier 1970. Il sera plus commode pour certains rapports par la suite.

+0

Cela aurait dû être un commentaire, pas une réponse. – DocRattie

0

Les options sont printf '%(fmt)T de ksh93 ou date -d fmt de date disponible dans les implémentations AST et GNU. Vous pouvez convertir en secondes d'époque et filtrer le journal en conséquence.

Exemple:

#!/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 "[email protected]" 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 : 

sortie:

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 est voiturette pour le moment donc printLastNDays forces en utilisant /bin/date.