J'ai écrit un script bash responsable de la «réduction» d'un fichier journal. Étant donné un fichier journal du format:Problèmes de performances avec le script bash
21 Oct 2017 12:38:03 [DEBUG] Single line message
21 Oct 2017 12:38:05 [DEBUG] Multi line
message
that may continue
several lines
21 Oct 2017 12:38:07 [DEBUG] Single line message
Réduire le fichier journal dans un seul fichier revêtu d'un caractère de séparation:
21 Oct 2017 12:38:03 [DEBUG] Single line message
21 Oct 2017 12:38:05 [DEBUG] Multi line; message; that may continue; several lines
21 Oct 2017 12:38:07 [DEBUG] Single line message
Le script bash suivant atteint cet objectif, mais à un rythme lent atrocement . Un journal d'entrée de 500 Mo peut prendre 30 minutes sur une machine à 8 cœurs de 32 Go.
while read -r line; do
if [ -z "$line" ]; then
BUFFER+=$LINE_SEPERATOR
continue
done
POSSIBLE_DATE='cut -c1-11 <<< $line'
if [ "$PREV_DATE" == "$POSSIBLE_DATE" ]; then # Usually date won't change, big comparison saving.
if [ -n "$BUFFER" ]; then
echo $BUFFER
BUFFER=""
fi
BUFFER+="$line"
elif [[ "$POSSIBLE_DATE" =~ ^[0-3][0-9]\ [A-Za-z]{3}\ 2[0-9]{3} ]]; then # Valid date.
PREV_DATE="$POSSIBLE_DATE"
if [ -n "$BUFFER" ]; then
echo $BUFFER
BUFFER=""
fi
BUFFER+="$line"
else
BUFFER+="$line"
fi
done
Des idées comment je peux optimiser ce script? Il ne semble pas que la regex soit le goulot d'étranglement (ma première optimisation) car maintenant cette condition est rarement atteinte.
La plupart des lignes du fichier journal sont des lignes simples. Il ne s'agit donc pas d'une comparaison directe des 11 premiers caractères.
Merci.
Utilisez simplement Python. Ce sera tellement mieux que les processus de reproduction chaque fois que vous lisez une ligne. Ou utilisez AWK. –
'POSSIBLE_DATE = 'couper -c1-11 <<< $ line'' à moins qu'il y ait un problème de copier-coller, votre condition ne teste pas ce que vous voulez ... – Mat