Powyższy skrypt wymaga dostosowania powodem rotacji loga.
Po rotacji loga cały system zbierania informacji nie działa prawidłowo.
W między czasie wymyśliłem coś innego, co w zupełności zamyka temat.
Kod: Zaznacz cały
#!/bin/bash
svlog=/usr/local/games/steam_servers/kfserver_mod/log/server_kf_mut.log
lista=/usr/local/games/steam_servers/kfserver_mod/log/player.list
exist_id=/usr/local/games/steam_servers/kfserver_mod/log/exist_id.list
score=/usr/local/games/steam_servers/kfserver_mod/log/score.list
dbconn="mysql -u user -h localhost --password=password baza_danych"
tabela="tabela"
echo "SELECT id from $tabela" | $dbconn | grep -v 'id' > $exist_id
grep 'New Player' $svlog | awk '{print $4" "$5}' | tr --delete '=;:`<>,-/?!@#$%^&(){}[]""~''' | sort | uniq -c > $lista
while read LINE
do
conn="$(echo $LINE | awk '{print $1}')"
players="$(echo $LINE | awk '{print $2}')"
ids="$(echo $LINE | awk '{print $3}' | cut -c 3-)"
echo ""
echo "Przetwarzam dane dla $players $ids $conn "
if grep -q "$players" "$score" ; then
new_score="$(grep "$players" "$score" | awk '{print $2}' | sort -nr | head -n1)"
echo "Nowe score dla $players wynosi $new_score"
else
new_score="0"
echo "Nowe score dla $players wynosi $new_score bo nie ma $players w $score"
fi
if grep -q "$ids" "$exist_id" ; then
last_score="$(echo "SELECT killed_zeds from $tabela WHERE player='$players'" | $dbconn | grep -v 'killed_zeds')"
echo "Poprzedni wynik dla $players wynosi $last_score"
echo "UPDATE $tabela SET connections=connections +$conn WHERE id ='$ids'" | $dbconn
echo "Polaczenia gracza $players zostaly zaktualizowane o $conn"
else
last_score="0"
echo "Poprzedni wynik dla $players wynosi $last_score bo nie ma $players w db"
echo "INSERT INTO $tabela (id,player,killed_zeds,connections) VALUES ('$ids','$players','$new_score','$conn')" | $dbconn
echo "Dodano $players do bazy danych z id: $ids , wynikiem: $new_score oraz polaczen: $conn"
fi
if grep -q "$players" "$score" ; then
compare_result="$(echo "$new_score > $last_score" | bc)"
if [ $compare_result != "0" ]; then
echo "$new_score jest wieksze od $last_score"
echo "UPDATE $tabela SET killed_zeds = $new_score WHERE id = '$ids'" | $dbconn
echo "Aktualizuje baze danych dla $players o wynik $new_score"
else
echo "$new_score jest mniejsze od $last_score baza danych pozostanie nie zmieniona"
fi
fi
done < $lista
rm $lista
rm $exist_id
rm $score
Dodane:
Hej ludzie pomóżcie, jak usuwać znaki nie alfabetyczne? To co mam mi nie działa prawidłowo i gdy taki-owaki gracz ma np. apostrof (') w nazwie to mi się wykrzacza składnia polecenia dla MYSQL.
Dane zbieram poleceniem:
Kod: Zaznacz cały
grep 'New Player' $svlog | awk '{print $4" "$5}' | tr --delete '=;:`<>,-/?!@#$%^&(){}[]""~''' | sort | uniq -c
i choć ma niby usuwać znaki:
to jednak to nie do końca działa.
Podczas interpretowaniu delikwenta np.:
który to ma w nazwie apostrofy, mam:
przy:
Kod: Zaznacz cały
echo "INSERT INTO $tabela (id,player,killed_zeds,connections) VALUES ('$ids','$players','$new_score','$conn')" | $dbconn
polegający na tym, że po wywołaniu zmiennych powstaje coś takiego:
Kod: Zaznacz cały
echo "INSERT INTO tabela (id,player,killed_zeds,connections) VALUES ('47572412', '[B]Taine'_'Snp3R[/B]','2060','2')" | $dbconn
Oto przykład:
Kod: Zaznacz cały
Przetwarzam dane dla Cap'Taine'_'Snp3R 47572412 2
Nowe score dla Cap'Taine'_'Snp3R wynosi 2060
Poprzedni wynik dla Cap'Taine'_'Snp3R wynosi 0 bo nie ma Cap'Taine'_'Snp3R w db
ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Taine'_'Snp3R','2060','2')' at line 1
Dodano Cap'Taine'_'Snp3R do bazy danych z id: 47572412 , wynikiem: 2060 oraz polaczen: 2
2060 jest wieksze od 0
Aktualizuje baze danych dla Cap'Taine'_'Snp3R o wynik 2060
Oraz jeszcze jeden błąd :
Kod: Zaznacz cały
Przetwarzam dane dla ﮐ��I����_Mad_D 23425959 2
Nowe score dla ﮐ��I����_Mad_D wynosi 0 bo nie ma ﮐ��I����_Mad_D w /usr/local/games/steam_servers/kfserver_mod/log/score.list
ERROR 1267 (HY000) at line 1: Illegal mix of collations (latin2_general_ci,IMPLICIT) and (latin1_swedish_ci,COERCIBLE) for operation '='
Poprzedni wynik dla ﮐ��I����_Mad_D wynosi
Polaczenia gracza ﮐ��I����_Mad_D zostaly zaktualizowane o 2
ale to już muszę sobie darować bo jak myślę będzie nie możliwe tego rodzaju problem rozwiązać...
Z góry dziękuje za pomoc...