Killing Floor - lokalne statystyki
Skrypt działa. Niestety kolejne uruchomienie skryptu duplikuje wszystkie wpisy.
Musze za każdym razem czyścic tabele przed wykonaniem skryptu czy jak?
Po pierwszym wykonaniu skryptu:
Po drugim wykonaniu skryptu:
Tu akurat ktoś się podłączył wiec jest jeden więcej. To świadczy o tym że całość działa.
Po trzecim wykonaniu skryptu:
180+181+181=542
Musze za każdym razem czyścic tabele przed wykonaniem skryptu czy jak?
Po pierwszym wykonaniu skryptu:
Kod: Zaznacz cały
180 wszystkich, Wykonanie zapytania trwało 0.0004 sekund(y)
Tu akurat ktoś się podłączył wiec jest jeden więcej. To świadczy o tym że całość działa.

Kod: Zaznacz cały
361 wszystkich, Wykonanie zapytania trwało 0.0012 sekund(y)
Kod: Zaznacz cały
542 wszystkich, Wykonanie zapytania trwało 0.0005 sekund(y)
kf_users.awk
kf_users.sh
Ten kod u mnie działa na 100% nie powiela wpisów. Testowałem go na tym Twoim wielkim logu i działa poprawnie. Ewentualnie wyłącz linijkę:
I zobacz, czy tworzy u Ciebie plik tmp.log. Innych pomysłów nie mam bo po prostu działa.
Kod: Zaznacz cały
$1 ~ /^[[:digit:]]/ {
connb[$2]= $3; nickb[$2]=$2;}
$2 ~ /New/ && $3 ~ /Player/ {
if (start) {
znalazl=0;
{for (x in conn) {
sub(/[\'\"\`\\\$]/, "", $4)
if ( x == $4) {
znalazl=1;
conn[x]++; break
}
}}
{if (znalazl == 0) {
sub(/[\'\"\`\\\$]/, "", $4)
conn[$4]= 1; id[$4]= substr($5, 4); nick[$4]=$4;}}
} else {
start=1;
sub(/[\'\"\`\\\$]/, "", $4)
conn[$4] = 1; id[$4]= substr($5, 4); nick[$4]=$4
}}
END {
tabela="nazwa_tabeli"; //config
for (l in conn) {
if (!nickb[l]) {
insert_tb="INSERT INTO "tabela "(id, player, connections) VALUES ("id[l]", '"nick[l]"',"conn[l]")"
print "mysql -u user -h localhost --password=haslo produkty -Bse \""insert_tb"\"" | "/bin/bash"
} else {
if (conn[l] > connb[l]) {
update_tb= "UPDATE "tabela" SET connections="conn[l]" WHERE player='"nick[l]"'"
print "mysql -u user -h localhost --password=haslp produkty -Bse \""update_tb"\"" | "/bin/bash"
}
}
}
}
Kod: Zaznacz cały
#!/bin/bash
USER="root"
HASLO="haslo_bazy";
HOST="localhost";
BAZA="nazwa_bazy";
TABELA="nazwa_tabeli";
KF_LOG="kf_users.log";
TEMP="tmp.log";
mysql -u ${USER} -h ${HOST} --password=${HASLO} ${BAZA} -Bse "DESCRIBE ${TABELA}" &> /dev/null
if [ $? -eq 0 ]; then
mysql -u ${USER} -h ${HOST} --password=${HASLO} ${BAZA} -Bse "SELECT * FROM ${TABELA}" > ${TEMP}
awk -f kf_users.awk ${TEMP} ${KF_LOG}
rm ${TEMP}
else
echo "tabela nieistnieje. Tworze...";
mysql -u ${USER} -h ${HOST} --password=${HASLO} ${BAZA} -Bse "CREATE TABLE ${TABELA} (id INT(10) NOT NULL, player CHAR(40) NOT NULL, connections INT(11) NOT NULL) "
if [ $? -eq 0 ]; then
echo "Tabela utworzona. Prosze wywołać skrypt raz jeszcze"
else
echo "Nie udalo się utworzyć tabeli. Sprawdź konfigurację, i spróbuj raz jeszcze"
fi
fi
Kod: Zaznacz cały
rm ${TEMP}
I zobacz, czy tworzy u Ciebie plik tmp.log. Innych pomysłów nie mam bo po prostu działa.
Dzięki nie dającej się opisać słowami pomocy, uzyskałem taki oto kod:
Skrypt działa wyśmienicie.
Tutaj UWAGA! Wymaga zainstalowania gawk!
Kod: Zaznacz cały
#!/bin/bash
USER="xxxxx"
HASLO="yyyyyyyyyyyyyyyyyyy";
HOST="localhost";
BAZA="zzzzzzzzzz";
TABELA="players_basic";
KF_LOG="server_kfbasic.log";
TEMP="tmp.log"; #to tymczasowy plik nazwijmy "wymiany", zostaw tak jak jest
mysql -u ${USER} -h ${HOST} --password=${HASLO} ${BAZA} -Bse "DESCRIBE ${TABELA}" &> /dev/null
if [ $? -eq 0 ]; then
mysql -u ${USER} -h ${HOST} --password=${HASLO} ${BAZA} -Bse "SELECT * FROM ${TABELA}" > ${TEMP}
awk -f kf_users.awk ${TEMP} ${KF_LOG}
rm ${TEMP}
else
echo "tabela nieistnieje. Tworze...";
mysql -u ${USER} -h ${HOST} --password=${HASLO} ${BAZA} -Bse "CREATE TABLE ${TABELA} (nr INT(10) NOT NULL AUTO_INCREMENT, id INT(10) NOT NULL, player CHAR(40) NOT NULL, connections INT(11) NOT NULL, PRIMARY KEY(nr))"
if [ $? -eq 0 ]; then
echo "Tabela utworzona. Prosze wywołać skrypt raz jeszcze"
else
echo "Nie udalo się utworzyć tabeli. Sprawdź konfigurację, i spróbuj raz jeszcze"
fi
fi
Kod: Zaznacz cały
$1 ~ /^[[:digit:]]/ {
connb[$3]= $4; nickb[$3]=$3;}
$2 ~ /New/ && $3 ~ /Player/ {
if (start) {
znalazl=0;
{for (x in conn) {
sub(/[\'\"\`\\\$\t\n\r *]/, "", $4)
if ( x == $4) {
znalazl=1;
conn[x]++; break
}
}}
{if (znalazl == 0) {
sub(/[\'\"\`\\\$\t\n\r *]/, "", $4)
conn[$4]= 1; id[$4]= substr($5, 4); nick[$4]=$4;}}
} else {
start=1;
sub(/[\'\"\`\\\$\t\n\r *]/, "", $4)
conn[$4] = 1; id[$4]= substr($5, 4); nick[$4]=$4
}}
END {
tabela="players_basic"; //config
for (l in conn) {
if (!nickb[l]) {
insert_tb="INSERT INTO "tabela "(id, player, connections) VALUES ("id[l]", '"nick[l]"',"conn[l]")"
print "mysql -u xxxxxx -h localhost --password=yyyyyyyyyyyyyyy zzzzzzz -Bse \""insert_tb"\"" | "/bin/bash"
} else {
if (conn[l] > connb[l]) {
update_tb= "UPDATE "tabela" SET connections="conn[l]" WHERE player='"nick[l]"'"
print "mysql -u xxxxxx -h localhost --password=yyyyyyyyyyyyyyy zzzzzzz -Bse \""update_tb"\"" | "/bin/bash"
}
}
}
}
Tutaj UWAGA! Wymaga zainstalowania gawk!
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.
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:
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:
polegający na tym, że po wywołaniu zmiennych powstaje coś takiego:
Oto przykład:
Oraz jeszcze jeden błąd :
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...
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
Kod: Zaznacz cały
=;:`<>,-/?!@#$%^&(){}[]""~''
Podczas interpretowaniu delikwenta np.:
Kod: Zaznacz cały
Cap'Taine'_'Snp3R
Kod: Zaznacz cały
SQL syntax error
Kod: Zaznacz cały
echo "INSERT INTO $tabela (id,player,killed_zeds,connections) VALUES ('$ids','$players','$new_score','$conn')" | $dbconn
Kod: Zaznacz cały
echo "INSERT INTO tabela (id,player,killed_zeds,connections) VALUES ('47572412', '[B]Taine'_'Snp3R[/B]','2060','2')" | $dbconn
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
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
Z góry dziękuje za pomoc...