Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Strony: 1


Członek DUG



Witam,
Muszę wstawić do MySQL , wszystko co jest w access.log apache2. Zmieniłem sobie konfigurację tak, że najpierw mam IP, DATE, GDZ, URL, AGENT.
Wszystko super, problem zaczyna się jak mam dodać do bazy danych adresy IP wstawia mi duplikaty i nie wiem jak to odfiltrować.
file=$1
MyUSER="root"
MyPASS="pass"
MyHOST="192.168.2.88"
MyPORT="3306"
SQLDB="getip"
SQLT="access_new"
if [ $# -lt 1 ]; then # jeżeli nie podano argumentów
echo "Podaj nazwe pliku!"
exit
else
file=$1
id=0
ll=`cat $file |wc -l`
for X in `seq $ll`
do
fip=`cat $file | grep -o "[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}" |head -n $X |tail -n1`
fdate=`cat $file |awk '{print $1}' |cut -d"[" -f2 |head -n $X |tail -n1`
ftime=`cat $file | awk '{print $2}' |head -n $X |tail -n1`
fget=` cat $file | awk '{print $7" "$8}' |head -n $X |tail -n1`
fagent=`cat $file | awk '{print $13}' |head -n $X |tail -n1`
#Insert data into database
SEARCH=`mysql -u${MyUSER} --password=${MyPASS} -D${SQLDB} -h${MyHOST} --port=${MyPORT} --skip-column-name -se "select getip from $SQLT WHERE getip LIKE '%${fip}%';"`
if [ "${SEARCH}" = ${fip} ]; then
echo "Pomijam duplikacja .... $fip "
else
mysql -u${MyUSER} --password=${MyPASS} -D${SQLDB} -h${MyHOST} --port=${MyPORT} -e"insert into $SQLT values (NULL,'$fip','$fdate','$ftime','$fagent','$fget');"
echo "Dodaje $fip ... $fdate ... OK ... "
fi
doneMoże ktoś mi pomóc ? Dzięki
Offline

Użytkownik


Przygotuj sobie najpierw access loga, żeby nie miał duplikujących się ipków:
cat access.log | sort -u -k1,1 > access.log.sorted
Chyba, że źle zrozumiałem :)
Offline







Podobno człowiek...;)








Zaryzykuję stwierdzenie, że Bash się średnio nadaje do takiej zabawy nadaje, radziłbym raczej Perla lub Pythona.
A potem? - jak znajdzie kilka razy ten sam adres, to tylko raz wpisuje?
Albo każdy nowy adres wpisuje do tablicy asocjacyjnej, jeśli go w niej nie ma, jeśli jest, to kończy pętlę
i obrabia następny wpis, albo updatuje w tablicy wpis dotyczący godziny pierwszej i ostatniej wizyty.
To samo można zrobić, nawet lepiej, w tablicy Mysql - ENGINE MEMORY, gdzie posortuje sobie adresy IP, wyciągnie unikalne.
I przede wszystkim języki programowania mogą w jednym połączeniu mysql obrobić XX zapytań, a wynik zapytań trzymać w zmiennych, a w bashu, żeby zrobić jeden wpis, to musisz osobne połączenie z osobnym logowaniem, czyli łopatologia stosowana w najgorszej możliwej formie.
To samo z regexem, np w perlu kompilujesz wyrażenie, wczytujesz do zmiennej, i potem lata w całym skrypcie zmienna z zapisanym i skompilowanym wyrażeniem, w Bashu po prostu nie ma takich cudów..
Inne wyjście, to:
libapache2-mod-log-sql-mysql - Use SQL to store/write your Apache queries logs - MySQL interface,
a potem odpowiednim zapytaniem wyciągać z sql dane do skrypta, celem starannego posortowania.
;)
Tu masz stosowne tutki do Perla:
http://www.tizag.com/perlT/perlmysqlquery.php
http://www.tizag.com/perlT/perlhashes.php
http://perldoc.perl.org/IO/File.html
A tu przykład gotowiutkiego skrypta, który conieco potrafi:
http://www.adp-gmbh.ch/perl/scripts/webalizer.html
EDIT:
megabajt napisał(-a):
Przygotuj sobie najpierw access loga, żeby nie miał duplikujących się ipków:
Kod:
cat access.log | sort -u -k1,1 > access.log.sortedChyba, że źle zrozumiałem :)
Pod tym jednak warunkiem, że nie będzie następnego pytania, np kiedy była pierwsza lub ostatnia wizyta z danego IP, ile było tych wizyt, itp.
Bo tutaj sprawa wygląda na rozwojową, jak to zwykle z logami. :D
Pozdro
;-)
Ostatnio edytowany przez Jacekalex (2013-06-10 16:14:45)
Offline



Też człowiek :-)




A jak masz w bazie zduplikowane wpisy z IP to po prostu
SELECT DISTINCT kolumna_z_ip FROM tabela
Offline
Strony: 1