2022-02-14 14:21:42 +00:00
#!/bin/bash
# Dernière révision : 2022/02/14
# Auteur : Zatalyz. Merci à YannK, Tycho et Glorf pour leurs nombreux conseils, les explications, l'aide et la patience !
# Licence CC0
# Ce script fait tout en un coup !
# 1) Splitter les logs de Ryzom qu'on lui file et les ranger dans les bons dossiers
# 2) Nettoyer et ne garder que les logs alentours
# Et ceci avec des lots de fichiers.
# ! Il faut que ce soit un seul perso par contre, ça ne veut pas marcher sinon !
# Attention, le script cherche en "dur" des années 2009 à 2025. Si les logs sont en dehors de ces dates, corrigez.
# Syntaxe : par défaut il va tout trouver et dire s'il y a un souci. Lancez simplement
# ./clean _log.sh
# Mais si besoin de préciser :
# ./clean _log.sh dossier_source dossier_tri dossier_alentours perso
# dossier_source = dossier des logs bruts au format ryzom
# dossier_tri = dossier de tri des fichiers bruts en un fichier par jour
# dossier_alentours = dossiers avec les fchiers de logs nettoyés pour ne garder que "alentours".
# perso = nom du perso
# Attention ! Gardez les logs originaux, dans quelques cas les lignes
# ne sont pas analysées correctement (cas des retours à la ligne comme
# dans les poèmes : la ligne ne commence plus par une date). Cela se controle avec le fichier
#############
# Variables #
#############
# Canaux à analyser
channels = "SAY\|SHOUT\|SYSTEM\/ZON"
# Vérification si le dossier source des logs existe et est renseigné
if [ -d " $1 " ]
then foldersource = " $1 "
echo " Le dossier $foldersource existe, passons à la suite " ;
else foldersource = "./sources_brutes"
if [ -d " $foldersource " ]
then echo " Le dossier $foldersource existe, passons à la suite " ;
else
mkdir -p " $foldersource "
echo " Le dossier $foldersource n'existait pas et été créé, déplacez les logs sources dedans " ;
exit
fi
fi
# Vérification si le dossier des logs bruts triés existe et sinon, le créer
if [ -d " $2 " ]
then folderrawsorted = " $2 "
echo " Le dossier $folderrawsorted existe, passons à la suite " ;
else folderrawsorted = "./sources_tri"
if [ -d " $folderrawsorted " ]
then echo " Le dossier $folderrawsorted existe, passons à la suite " ;
else mkdir -p " $folderrawsorted "
echo " Le dossier $folderrawsorted a été créé, passons à la suite " ;
fi
fi
# Vérifier si on a le dossier pour les logs alentours et sinon, le créer
if [ -d " $3 " ]
then folderaround = " $3 "
echo " Le dossier $folderaround existe, passons à la suite " ;
else folderaround = "./alentours"
if [ -d " $folderaround " ]
then echo " Le dossier $folderaround existe, passons à la suite " ;
else mkdir -p " $folderaround "
echo " Le dossier $folderaround a été créé, passons à la suite " ;
fi
fi
# Extraire le nom du persos depuis les noms de fichier
# TODO truc améliorable : arriver à gérer plusieurs persos
if [ -z " $4 " ]
then
myfunc( ) {
2022-02-15 21:48:48 +00:00
basename " $foldersource " /* .txt | cut -d_ -f2 | uniq
2022-02-14 14:21:42 +00:00
}
perso = " $( myfunc) "
else perso = " $4 "
fi
# Avoir une variable avec la majuscule au pseudo
pseudo = ${ perso ^ }
# Dossiers nécessaires à faire le travail
tmpfolder = "./tmplogfolder"
listrawlog = " $tmpfolder /listrawlog.txt "
rawfolder = " $tmpfolder /raw_logs "
yearfolder = " $tmpfolder /year_logs "
monthfolder = " $tmpfolder /month_logs "
dayfolder = " $tmpfolder /day_logs "
tmparoundfolder = " $tmpfolder /tmparoundfolder "
tmparoundfolder2 = " $tmpfolder /tmparoundfolder2 "
# Comme ils sont détruits à la fin, on les recrée à chaque fois
mkdir -p " $tmpfolder " " $rawfolder " " $yearfolder " " $monthfolder " " $dayfolder " " $tmparoundfolder " " $tmparoundfolder2 "
echo " Fichiers du personnage $pseudo prêts à être traités " ;
#############
# Split #
#############
# Cette partie sépare les logs bruts en 1 fichier de log par jour.
# On ne travaille pas sur les fichiers sources. Jamais.
# Parce qu'il y a parfois des blagues dans les logs, on nettoie l'encodage.
for file in " $foldersource " /*
do
originallog = " $( basename $file ) "
cat " $file " | tr -d "\000-\010" | tr -d "\016-\037" > " $rawfolder " /" $originallog "
done
# on va faire un très gros fichier avec tous les logs. Évitez de l'ouvrir avec un éditeur de texte basique.
cat " $rawfolder " /* > " $tmpfolder " /logcomplet_" $perso " .txt
#Et on va faire un fichier de controle donnant toutes les dates avec logs, et les lignes foireuses (genre chants) (à vérifier manuellement en cas de doute)
cut -c 1-11 " $tmpfolder " /logcomplet_" $perso " .txt | sort | uniq > controlline_" $perso " .txt
for logname in " $tmpfolder " /logcomplet_" $perso " .txt
do
# Vérification que les fichiers sont bien des fichiers, ce serait bête de planter le script pour un manque de vérification
if [ -f " $logname " ] ; then
#echo "$logname est un fichier et va être traité"
# On va faire un seul gros fichier par année
for year in { 2009..2025} ; do
#echo "${year}"
grep " ^ ${ year } / " " $logname " >> " $yearfolder " /" ${ year } " .log
# Effacer les fichiers vides
[ -s " $yearfolder " /" ${ year } " .log ] || rm -f " $yearfolder " /" ${ year } " .log
#echo "${year} traitée"
# On vérifie si le fichier d'année existe et on ne traite que celles qui existent
if [ -f " $yearfolder " /" ${ year } " .log ] ; then
# Puis on va faire un fichier par mois
for month in { 01..12} ; do
# echo "${year}/${month} en cours"
grep " ^ ${ year } / ${ month } " " $yearfolder " /" ${ year } " .log > " $monthfolder " /" ${ year } _ ${ month } " .log
[ -s " $monthfolder " /" ${ year } _ ${ month } " .log ] || rm -f " $monthfolder " /" ${ year } _ ${ month } " .log
# On vérifie si le fichier année/mois existe et on ne traite que ceux qui existent
if [ -f " $monthfolder " /" ${ year } _ ${ month } " .log ] ; then
#echo "$monthfolder"/"${year}_${month}".log
# Puis un fichier par jour
for day in { 01..31} ; do
#echo "${year}/${month}/${day} en cours"
grep " ^ ${ year } / ${ month } / ${ day } " " $monthfolder " /" ${ year } _ ${ month } " .log > " $dayfolder " /log_" $perso " _" ${ year } _ ${ month } _ ${ day } " .log
[ -s " $dayfolder " /log_" $perso " _" ${ year } _ ${ month } _ ${ day } " .log ] || rm -f " $dayfolder " /log_" $perso " _" ${ year } _ ${ month } _ ${ day } " .log
#echo "${year}/${month}/${day} traité"
done
fi
done
fi
done
else
echo " $logname n'est pas un fichier, il n'a pas été traité "
fi
done
#Tri des fichiers dans des dossiers du type Dossier_trié/année/mois/log.log
# On récupère la date, en formattant comme pour les logs
for f in $dayfolder /*.log
do
year = ${ f : -14 : 4 }
month = ${ f : -9 : 2 }
day = ${ f : -6 : 2 }
# On se fait une jolie variable qui imite la partie datée du nom des fichiers de log
log = log_" $perso " _" ${ year } _ ${ month } _ ${ day } .log "
# on créé le dossier de chaque mois dans les archives s'il n'existe pas
mkdir -p " $folderrawsorted " /" $year " /" $month / "
# on déplace ces logs dans leur archive
mv " $dayfolder " /" $log " " $folderrawsorted " /" $year " /" $month " /" $log "
done
echo "Les fichiers ont été découpés et rangés"
#############
# Alentours #
#############
# Alors là, la misère... car on a des fichiers dans des sous-dossiers.
# Le plus simple : tout remettre dans un dossier en vrac et traiter à partir de là.
find " $folderrawsorted " -maxdepth 4 -name '*.log' -exec cp { } " $tmparoundfolder " / \;
for mylog in " $tmparoundfolder /log " *.log
do
justnamelog( ) {
basename -s .log " $mylog "
}
namelog = " $( justnamelog) "
sourcelog = " $tmparoundfolder / ${ namelog } .log "
finallog = " $tmparoundfolder2 / ${ namelog } _alentours.txt "
#./1analyse_new_logryzom.sh $sourcelog $finallog
# Analyse des logs proprement dites
# Canaux à garder
# Alentours + Endroit où on est
grep " $channels " " $sourcelog " > templog.txt
# vire le timestamp de début des lignes. Garde le * si ça peut servir à nettoyer le sys.info..
cut -b 21- templog.txt > templog2.txt
# Enlève les couleurs des canaux
sed 's/@{[A-F0-9]\{4\}}//g' templog2.txt > templog3.txt
# enlever le nom des canaux :
sed -re 's:^\([A-Z/]+\) +\* +(.*)$:\1:' templog3.txt > templog4.txt
# laisser uniquement les phrases traduites (attention, ça peut être étrange)
sed -re 's#\{:[a-zA-Z]{2}:[^}]+\}@\{[[:space:]]##' templog4.txt > templog5.txt
# Remplacer "vous dites" par "Pseudo dit"
sed s/"Vous dites :" /" $pseudo dit : " /g templog5.txt > templog6.txt
sed s/"Vous criez" /" $pseudo crie : " /g templog6.txt > templog7.txt
# Si quelqu'un joue avec des caractères bizarres, ça remet tout d'aplomb
iconv -t utf-8 -c templog7.txt > " $finallog "
# Enlever les fichiers temporaires
rm templog*.txt
#echo "$sourcelog a été traité en tant que $finallog" #très bavard
done
# Retrier par année les fichiers nettoyés
for faround in $tmparoundfolder2 /*.txt
do
# penser à compter les 10 caractères "alentours" pour que la variable marche
year = ${ faround : -24 : 4 }
month = ${ faround : -19 : 2 }
day = ${ faround : -16 : 2 }
# On se fait une jolie variable qui imite la partie datée du nom des fichiers de log
finallogsorted = log_" $perso " _" ${ year } _ ${ month } _ ${ day } _alentours.txt "
# on créé le dossier de chaque mois s'il n'existe pas
mkdir -p " $folderaround " /" $year " /" $month / "
# on déplace ces logs dans leur archive
mv " $tmparoundfolder2 " /" $finallogsorted " " $folderaround " /" $year " /" $month " /" $finallogsorted "
done
#############
# Dernier ménage #
#############
# Nettoyage
rm -r " $tmpfolder "
# On compte et vérifie les fichiers
count = $( find $folderrawsorted -maxdepth 4 -name '*.log' | wc -l)
echo " Les sources sont triées en $count fichiers dans $folderrawsorted . Contrôlez ce nombre sur controlline_ $perso .txt "
countaround = $( find $folderaround -maxdepth 4 -name '*.txt' | wc -l)
echo " $countaround fichiers ont été nettoyés et rangés dans $folderaround . "
if [ " $count " = " $countaround " ]
then echo "Il semble y avoir le bon nombre de fichiers traités entre les bruts triés et les log nettoyés" ;
else echo "Attention, il y a une incohérence dans le nombre de fichiers traités entre les bruts triés et les log nettoyés" ;
fi