From 8290d2e45940f62f96dcd28c0e5bc5400f5d42d0 Mon Sep 17 00:00:00 2001 From: Zatalyz Date: Wed, 10 Nov 2021 22:29:54 +0100 Subject: [PATCH] push initial --- 1analyse_new_logryzom.sh | 28 +++++++ 2split_log.sh | 164 +++++++++++++++++++++++++++++++++++++++ 3analyse_old_logryzom.sh | 27 +++++++ README.md | 67 +++++++++++++++- sysinfo.ini | 122 +++++++++++++++++++++++++++++ 5 files changed, 406 insertions(+), 2 deletions(-) create mode 100755 1analyse_new_logryzom.sh create mode 100755 2split_log.sh create mode 100755 3analyse_old_logryzom.sh create mode 100644 sysinfo.ini diff --git a/1analyse_new_logryzom.sh b/1analyse_new_logryzom.sh new file mode 100755 index 0000000..fb5654e --- /dev/null +++ b/1analyse_new_logryzom.sh @@ -0,0 +1,28 @@ +#!/bin/bash +# Dernière révision : 2021/10/31 +# Auteur : Zatalyz. Merci à YannK, Tycho, Pulkomandy, Madi, Link Mauve et Glorf pour leurs nombreux conseils, les explications, l'aide et la patience ! +# Licence CC0 +# Ce script permet de ne garder que l'alentours et les emotes. +# Système adapté au nouveau système de log (à la fois plus simple puisque pas besoin du syslog, +# et un peu moins régulier dans les noms...) +# Fonctionnement idéal : /usr/bin/bash ./1analyse_new_logryzom.sh fichier_entrée fichier_sortie +# Par exemple : +# ./1analyse_new_logryzom.sh log_zatalyz.txt log_zatalye_alentours.txt +# On peut aussi renseigner les noms et chemins ici sur les variables : +logfile1="$1" +logsortie="$2" +# Canaux à garder +# Alentours + Endroit où on est +grep 'SAY\|SHOUT\|SYSTEM\/ZON' "$logfile1" > 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 +# Si quelqu'un joue avec des caractères bizarres, ça remet tout d'aplomb +iconv -t utf-8 -c templog5.txt > "$logsortie" +# Enlever les fichiers temporaires +rm templog*.txt diff --git a/2split_log.sh b/2split_log.sh new file mode 100755 index 0000000..fb649f8 --- /dev/null +++ b/2split_log.sh @@ -0,0 +1,164 @@ +#!/bin/bash +# Dernière révision : 2021/10/31 +# Auteur : Zatalyz. Merci à YannK, Tycho et Glorf pour leurs nombreux conseils, les explications, l'aide et la patience ! +# Licence CC0 +# Ce script sépare les logs en 1 fichier de log par jour. +# Il est prévu pour les logs du jeu Ryzom mais peut s'adapter à d'autres types de log (virer "pseudo !") +# Mettre tous les logs en vrac dans le même dossier que le script, et lancer la moulinette. +# La bonne commande à passer est +# cmd ./dossiersource ./dossier final [nomperso] +# Sans argument des variables par défaut seront utilisées. Le nom du perso peut être déduit des logs +# Exemple : +# ./split_log.sh ./logbrut/zatalyz/ ./final john +# => les fichiers seront traités depuis ./logbrut/zatalyz/, et mis dans le dossier ./final sous le nom de log_john_année_mois_jour.txt +# sans préciser "john", le nom des logs sera probablement celui de zatalyz, si les fichiers d'origine sont bien formatés comme log_zatalyz.txt ou log_zatalyz_*.txt +# Le script range aussi les logs. +# Attention ! Il laisse quelques fichiers dans le dossier courant. +# 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). + + +############# +# Variables # +############# +# Variables par défaut dans les checks : pouvoir les changer ? + +# Vérification si le dossier source des logs existe et est renseigné +if [ -d "$1" ] + then originalfolderlog="$1" + else originalfolderlog="./logsource" +fi +# Vérification si le dossier final des logs existe et est renseigné +if [ -d "$2" ] + then finalfolder="$2" + else finalfolder="./final_logs" +fi +# Vérification si un nom de perso est donné et sinon, extraction depuis les noms de fichier +if [ -z "$3" ] + then + myfunc() { + basename -a "$originalfolderlog"/* | cut -d_ -f2 | uniq + } + perso="$(myfunc)" + else perso="$3" +fi + +echo "Résultat final : nous partons de $originalfolderlog pour mettre les logs de $perso dans $finalfolder" + +# Variables des dossiers de travail +tmpfolder="./tmplogfolder" +listrawlog="$tmpfolder/listrawlog.txt" +rawfolder="$tmpfolder/raw_logs" +yearfolder="$tmpfolder/year_logs" +monthfolder="$tmpfolder/month_logs" +dayfolder="$tmpfolder/day_logs" + +############# +# Script # +############# +# Vérifier si on a les dossiers temporaires de travail et sinon, les créer +if [ -d "$rawfolder" ];then +echo "Le dossier $rawfolder existe, passons à la suite"; +else +mkdir -p "$rawfolder" +echo "Le dossier $rawfolder a été créé, passons à la suite"; +fi +if [ -d "$yearfolder" ];then +echo "Le dossier $yearfolder existe, passons à la suite"; +else +mkdir -p "$yearfolder" +echo "Le dossier $yearfolder a été créé, passons à la suite"; +fi +if [ -d "$monthfolder" ];then +echo "Le dossier $monthfolder existe, passons à la suite"; +else +mkdir -p "$monthfolder" +echo "Le dossier $monthfolder a été créé, passons à la suite"; +fi +if [ -d "$dayfolder" ];then +echo "Le dossier $dayfolder existe, passons à la suite"; +else +mkdir -p "$dayfolder" +echo "Le dossier $dayfolder a été créé, passons à la suite"; +fi +if [ -d "$finalfolder" ];then +echo "Le dossier $finalfolder existe, passons à la suite"; +else +mkdir -p "$finalfolder" +echo "Le dossier $finalfolder a été créé, passons à la suite"; +fi + +# 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 "$originalfolderlog"/* +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 +echo "$tmpfolder"/logcomplet_"$perso".txt et controlline_"$perso".txt créés + +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é/perso/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 "$finalfolder"/"$perso"/"$year"/"$month/" + # on déplace ces logs dans leur archive + mv "$dayfolder"/"$log" "$finalfolder"/"$perso"/"$year"/"$month"/"$log" +done +echo "Les fichiers ont été découpés et rangés" + +# Nettoyage +#rm -r "$tmpfolder" +echo "faites un rm -r $tmpfolder si le dossier tmp était bien JUSTE pour le script..." +echo "Tout est bon. Contrôlez le nombre de fichiers entre $finalfolder et controlline_$perso.txt" diff --git a/3analyse_old_logryzom.sh b/3analyse_old_logryzom.sh new file mode 100755 index 0000000..0b187f5 --- /dev/null +++ b/3analyse_old_logryzom.sh @@ -0,0 +1,27 @@ +#!/bin/bash +# Dernière révision : 2021/10/31 +# Auteur : Zatalyz. Merci à Madi, sans qui tout ça n'aurait jamais pu existé. Que ton Perl soit sanctifié. +# Licence CC0 +# Ce script permet de ne garder que l'alentours et les emotes. +# Les commandes sont paramétrées pour l'ancien système de log +# Améliorer le sysinfo au fil des nettoyages. +# Fonctionnement idéal : usr/bin/bash ./analyselogryzom.sh fichier_entrée fichier_sortie +# On peut aussi renseigner les noms et chemins ici sur les variables : +#logfile1="/home/zatalyz/Alinea/Histoires/Ryzomstories/log/logbrut/tri_perso_log/denakyo/log_denakyo2012_1215.txt" +#logsortie="log_denakyo2012_1215_alentours.txt" +logfile1="$1" +logsortie="$2" +# Canaux à virer (option -v) +grep -v 'F4FF\|F80F\|BBBF\|18EF\|FCCF\|78FF\|AFBF\|BBFF' "$logfile1" > templog.txt +# canaux à garder +# grep "FFFF\|F99F\|FF4F" +# vire le timestamp de début des lignes. Garde le * si ça peut servir à nettoyer le sys.info.. +cut -b 23- templog.txt > templog2.txt +# enlever le nom des canaux @{FFFF} +sed 's/@{[A-F0-9]\{4\}}//g' templog2.txt > templog3.txt +# Si quelqu'un joue avec des caractères bizarres, ça remet tout d'aplomb +iconv -t utf-8 -c templog3.txt > templog4.txt +# analyser un fichier d'expression régulières de sysinfo et virer ce qui matche +#grep -v -f "$fichier" +grep -v -f sysinfo.ini templog4.txt > "$logsortie" +#rm templog*.txt diff --git a/README.md b/README.md index 71c186b..80ea5d5 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,66 @@ -# ryzom_log_cleaner +# Gestion des logs +Ensemble de scripts bash pour nettoyer les logs clients de Ryzom + +## Analyse New log +Pour analyser les logs d'après 2012/2013, par là. +Fonctionnement idéal : /usr/bin/bash ./1analyse_new_logryzom.sh fichier_entrée fichier_sortie +Par exemple : +./1analyse_new_logryzom.sh log_zatalyz.txt log_zatalye_alentours.txt + +Liste des canaux, si on veut filtrer autrement : +SAY : alentours +SAY/EMT : emotes +SAY/BBL : messages de PNJ +SAY/SHOUT : cris + +UNIVERSE : Univers +REGION : comme indiqué + +SYSTEM : messages systèmes +SYSTEM/BC : Broadcast (annonces des administrateurs) +SYSTEM/AROUND : messages en alentours qui ne sont pas dit par des homins (genre "bienvenue sur ryzom) +SYSTEM/ZON : Endroit où le personnage se trouve (affiché lors des changements de zone) +SYSTEM/SPLM : Combat ? +SYSTEM/SPL : Combat aussi +SYSTEM/CHK : Check du système +SYSTEM/ITM : gestion des items (type achat de TP) +SYSTEM/DG : dégâts +SYSTEM/DMG : Dommages +SYSTEM/MIS : parade/esquive +SYSTEM/ISE : Effets de type vedice etc +SYSTEM/PVPTM : infos autour du pvp +SYSTEM/TSK : informations à propos des missions +SYSTEM/XP : expérience gagnée +SYSTEM/THM : encyclopédie + +GUILD/MTD : Mot du jour de la Guilde +GUILD : Messages en guilde + +DYN0, DYN1, DYN3, etc : canaux dynamiques. Le canal de langue est souvent sur DYN0 + +TELL : messages privés +TEAM : messages en équipe + +## Analyse Old Log +Pour les logs d'avant le changement de système (donc avant 2013, je crois). Il FAUT un fichier sysinfo.ini, qui contient toutes les expressions régulières à filtrer (tout ce qui est dans le sys.infos). C'était plus lourd. Les canaux sont gardés selon un code couleur. À documenter, un jour, peut-être, ou pas : ça se retrouve en regardant les logs. + +## Splitlog +Ce script sépare les logs en 1 fichier de log par jour. +Il est prévu pour les logs du jeu Ryzom mais peut s'adapter à d'autres types de log (virer "pseudo !") +Mettre tous les logs en vrac dans le même dossier que le script, et lancer la moulinette. + +La bonne commande à passer est + cmd ./dossiersource ./dossier final [nomperso] +Sans argument des variables par défaut seront utilisées. Le nom du perso peut être déduit des logs +Exemple : + ./split_log.sh ./logbrut/zatalyz/ ./final john +=> les fichiers seront traités depuis ./logbrut/zatalyz/, et mis dans le dossier ./final sous le nom de log_john_année_mois_jour.txt sans préciser "john", le nom des logs sera probablement celui de zatalyz, si les fichiers d'origine sont bien formatés comme log_zatalyz.txt ou log_zatalyz_*.txt + +Le script range aussi les logs. + +Attention ! Il laisse quelques fichiers dans le dossier courant. 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). + +## Crédits et licence + +Auteur : Zatalyz. Tout est sous licence CC0, c'est de l'assemblage de bons conseils et de tests, rien de transcendant. Plus de détail dans chaque script. -Ensemble de scripts bash pour nettoyer les logs clients de Ryzom \ No newline at end of file diff --git a/sysinfo.ini b/sysinfo.ini new file mode 100644 index 0000000..6a0db07 --- /dev/null +++ b/sysinfo.ini @@ -0,0 +1,122 @@ +# Pas de ligne vide dans ce fichier ! Les commentaires fonctionnent. +# Sys.Info : lignes commençants par... +^Bienvenue dans Ryzom +^MDJ +^Vous êtes +^Vous quittez +^La téléportation +^Vous avez détruit +^Vous avez acheté +^Vous avez reçu +^Vous prenez votre +^Vous rangez +^Votre action de création +^Vous vendez +^Vos .* ont été vendu(e)s +^Votre expérience dans la compétence +^Vous avez déposé +^Déconnexion annulée +^Affichage des personnages en ligne dans la région +^Vous avez franchi +^Vous proposez à +^Vous avez créé +^Vous invitez +^Vous avez quitté +^Votre \w* \w* a été vendu +^Joueurs dans le canal de discussion +^Nouvelle cible ajoutée au compas +^Votre compétence +^Vous avez gagné +^L[[:punct:]]échange est accepté +^Vous achetez +^Votre +^Vous rejoignez +^\w* a quitté votre équipe\. +^\w* est maintenant le chef de votre équipe\. +^\w* succède au chef de votre équipe\. +^Vous étiez +^Afficher les CSRs en ligne +^Aucun personnage trouvé +^\w* est inconnu(e) ou déconnecté(e)\. +^Tâche réussie\. +# Avec le nom du perso ou des autres +^\"\w*\" a été sauvegardée\. +^\w* rejoint +^\w*\. +^Vous avez +# Combat +^Vous ciblez +^Vous jetez +^Votre sort +^Vous soignez +^Vous régénérez +^\w* est maintenant au maximum +^.* vous attaque\. +^.* atteint \w* \w*, infligeant +^.* vous porte un coup critique +^.* a esquivé votre attaque +^.* a paré votre attaque +^.* vous rate. +^.* quitte le combat +^.* vous fait perdre [[:digit:]]* points +^.* résiste aux effets de votre sort\. +^.* vous atteint mais n[[:punct:]]inflige pas de dégâts\. +^.* n[[:punct:]]est plus \w*\. +^.* subit une pénalité sur ses esquives\. +^.* vous a enraciné et vous ne pouvez plus bouger\. +^.* subit une pénalité sur ses compétences de combats\. +^.* vous a désarmé\. +^Vous attaquez +^Vous atteignez +^Vous avez esquivé +^Vous avez paré +^Vous ratez +^Vous ralentissez +^Vous étourdissez +^Vous avez tué +^Vous commencez +^Les effets du pouvoir +^A la recherche de ressources +^Vous avez trouvé des ressources +^Vos compétences de combats ne sont plus soumises à une pénalité +^Vous portez +^Vous faites +^Vous avez été tué +^Votre pénalité de décès +^\w* vous jette +^\w* vous soigne +^\w* vous régénère +^Vous subissez des dégâts +^Vous pourrez être attaqué +^Vous pouvez encore être attaqué +^Vous obtenez +^Bravo \! Vous obtenez la nouvelle compétence +^Vous n[[:punct:]]obtenez +^\w* obtient .* de qualité [[:digit:]]*\. +^Il n[[:punct:]]y a rien à dépecer +^Vous n[[:punct:]]avez pas le droit de dépecer cette carcasse +^La cadavre que vous essayez +^Le cadavre que vous essayez +^Vous n[[:punct:]]êtes +^Votre incantation +^Vous activez +^Vous gagnez +^Vous perdez +^Vous consommez +^Vous ne pouvez pas jeter un sort sur un cadavre +^Votre incantation est rompue +^Vos esquives ne subissent plus de pénalité +^Vous ne pouvez pas attaquer un personnage neutre +^Ce sort ne peut être jeté que sur un ennemi +^Vos attaques +^Vous n[[:punct:]]avez +^Vous ne pouvez pas +^\w* a lancé un sort qui vous inflige +^Vous résistez +^Vous interrompez +^Les attaques +^Les compétences +^Vous n[[:punct:]]attaquez plus +^Vous utilisez +#Forage +^La source \ No newline at end of file