J'écris un script où j'ai besoin de grep les journaux exactement entre deux horodatages donnés. Je ne veux pas utiliser regex car ce n'est pas une preuve complète. Existe-t-il un autre moyen d’y parvenir?

Par exemple: entre la plage horaire de 04:15:00 à 05:15:00

Format du journal:

170.37.144.10 - - [17/Dec/2015:04:00:00 -0500] "GET /abc/def/ghi/xyz.jsp HTTP/1.1" 200 337 3440 0000FqZTmTG2yuMTJeny7hPDOvG
170.37.144.10 - - [17/Dec/2015:05:10:09 -0500] "POST /abc/def/ghi/xyz.jsp HTTP/1.1" 200 27 21124 0000FqZTmTG2yuMTJ
1
Mr D 25 déc. 2015 à 13:57

2 réponses

Meilleure réponse

Si vous ne voulez pas utiliser d'expressions régulières ni de modèles pour faire correspondre les lignes, alors grep seul ne suffit pas.

Voici une solution de date Bash +:

# start and stop may be parameters of your script ("$1" and "$2"),
# here they are hardcoded for convenience.
start="17/Dec/2015 04:15:00 -0500"
stop="17/Dec/2015 05:15:00 -0500"

get_tstamp() {
    # '17/Dec/2015:05:10:09 -0500' -> '17/Dec/2015 05:10:09 -0500'
    datetime="${1/:/ }"
    # '17/Dec/2015 05:10:09 -0500' -> '17 Dec 2015 05:10:09 -0500'
    datetime="${datetime//// }"

    # datetime to unix timestamp
    date -d "$datetime" '+%s'
}

start=$(get_tstamp "$start")
stop=$(get_tstamp "$stop")

while read -r line
do
    datetime="${line%%:*}" # remove ':170.37.144.10 ...'
    tstamp="$(get_tstamp "$datetime")"

    # $tstamp now contains a number like 1450347009;
    # check if it is in range $start..$stop
    [[ "$tstamp" -ge "$start" && "$tstamp" -le "$stop" ]] && echo "$line"
done
1
Andrea Corbellini 25 déc. 2015 à 16:40

C'est peut-être ce que vous voulez faire, en utilisant GNU awk pour les fonctions de temps:

$ cat tst.awk
BEGIN { FS="[][ ]+"; beg=t2s(beg); end=t2s(end) }
{ cur = t2s($4) }
(cur >= beg) && (cur <= end)

function t2s(time,      t) {
    split(time,t,/[\/:]/)
    t[2]=(match("JanFebMarAprMayJunJulAugSepOctNovDec",t[2])+2)/3
    return mktime(t[3]" "t[2]" "t[1]" "t[4]+0" "t[5]+0" "t[6]+0)
}

$ awk -v beg="17/Dec/2015:04:15" -v end="17/Dec/2015:05:15" -f tst.awk file
access_log.aging.20151217040207:170.37.144.10 - - [17/Dec/2015:05:10:09 -0500] "POST /abc/def/ghi/xyz.jsp HTTP/1.1" 200 27 21124 0000FqZTmTG2yuMTJ

Mais il est difficile de deviner sans plus d'entrée d'échantillon et de sortie attendue.

2
Ed Morton 25 déc. 2015 à 17:49