49,10.96.25.156,1274x40x1,-,02/Nov/2017:21:14:31,http-nio-443-exec-20,"POST/rest/webResources/1.0/resourcesHTTP/1.1",503,40,0,"-","SilkPerformer17.0""-"
50,10.96.25.156,1274x41x1,-,02/Nov/2017:21:14:31,http-nio-443-exec-25,"POST/rest/webResources/1.0/resourcesHTTP/1.1",503,40,0,"-","SilkPerformer17.0""9myyx9"

Voici à quoi ressemble le fichier journal, toute aide serait appréciée. Merci!

-1
Manish Jha 17 nov. 2017 à 19:19

4 réponses

Meilleure réponse

Voici une solution pure awk:

#!/usr/bin/env awk -f

BEGIN {
  FS = OFS = ","

  # build our lookup of zero-padded month numbers
  split("Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec", marr, "|")
  for (i = 1; i <= 12; i++) {
    mhash[marr[i]] = sprintf("%02d", i)
  }
}

{
  # 1:dd 2:mmm 3:yyyy 4:hh 5:mi 6:ss
  split($5, dtarr, "[:/]")

  # replace the column with our reformatted date
  $5 = dtarr[3] "-" mhash[dtarr[2]] "-" dtarr[1] " " dtarr[4] ":" dtarr[5] ":" dtarr[6]

  # print the whole line
  print
}

Pour l'utiliser:

$ awk -f redate.awk access_log
49,10.96.25.156,1274x40x1,-,2017-11-02 21:14:31,http-nio-443-exec-20,"POST/rest/webResources/1.0/resourcesHTTP/1.1",503,40,0,"-","SilkPerformer17.0""-"

Ou vous pouvez le rendre exécutable:

$ chmod +x redate.awk

Et exécutez-le directement:

$ ./redate.awk access_log
49,10.96.25.156,1274x40x1,-,2017-11-02 21:14:31,http-nio-443-exec-20,"POST/rest/webResources/1.0/resourcesHTTP/1.1",503,40,0,"-","SilkPerformer17.0""-"
1
mwp 17 nov. 2017 à 18:14

Vous pouvez utiliser date ou awk pour effectuer la conversion. Si le package dateutils est installé, voici une commande simple que vous pouvez utiliser

dateutils.dconv -S -i "%d/%b/%Y:" -f "%F " < file.log
  • -i pour spécifier le format de la date d'entrée
  • -f pour spécifier le format de date de sortie
  • -S mode sed, pour traiter uniquement la chaîne de date correspondante

Contribution

49,10.96.25.156,1274x40x1,-,02/Nov/2017:21:14:31,http-nio-443-exec-20

Production

49,10.96.25.156,1274x40x1,-,2017-11-02 21:14:31,http-nio-443-exec-20
1
etopylight 17 nov. 2017 à 16:54

L'utilisation de la date pour la conversion pourrait ressembler à ceci

IFS=,
while read a b c d dat remaining
do
    dat=${dat//\// }  # remove all / from date-field
    dat=${dat/:/ }    # remove first : from date-field
    echo "$a,$b,$c,$d,$(date --date="$dat" "+%Y-%m-%d %H:%M:%S"),$remaining"
done < redate.dat

Nous devons d'abord changer le champ de date, en quelque chose que la date est capable de comprendre. Ensuite, nous choisissons le format de sortie selon les besoins.

0
ULick 19 nov. 2017 à 19:15

Conversion bash uniquement:

declare -A m
m=([Jan]=01 [Feb]=02 [Mar]=03 [Apr]=04 [May]=05 [Jun]=06 [Jul]=07 [Aug]=08 [Set]=09 [Oct]=10 [Nov]=11 [Dec]=12)
IFS='/:' read -r -a a <<< '02/Nov/2017:21:14:31'
echo "${a[2]}-${m[${a[1]}]}-${a[0]} ${a[3]}:${a[4]}:${a[5]}"

ÉDITER

Je veux dire quelque chose comme ça pour lire le fichier et diviser les lignes

printline() {
    local l=("$@")
    echo -n "${l[0]}"
    for f in "${l[@]:1}"
    do
        echo -n ",$f"
    done
    echo
}

declare -A m
m=([Jan]=01 [Feb]=02 [Mar]=03 [Apr]=04 [May]=05 [Jun]=06 [Jul]=07 [Aug]=08 [Set]=09 [Oct]=10 [Nov]=11 [Dec]=12)
while read line
do
    IFS=',' read -r -a l <<< "$line"
    IFS='/:' read -r -a a <<< ${l[4]}
    l[4]="${a[2]}-${m[${a[1]}]}-${a[0]} ${a[3]}:${a[4]}:${a[5]}"
    printline "${l[@]}"
done
0
Diego Torres Milano 17 nov. 2017 à 18:07
47355011