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!
4 réponses
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""-"
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
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.
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
De nouvelles questions
regex
Les expressions régulières fournissent un langage déclaratif pour faire correspondre les modèles dans les chaînes. Ils sont couramment utilisés pour la validation, l'analyse et la transformation de chaînes. Étant donné que les expressions régulières ne sont pas entièrement standardisées, toutes les questions avec cette balise doivent également inclure une balise spécifiant le langage de programmation ou l'outil applicable.