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
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 done
Może ktoś mi pomóc ? Dzięki
Offline
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
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
A jak masz w bazie zduplikowane wpisy z IP to po prostu
SELECT DISTINCT kolumna_z_ip FROM tabela
Offline
Strony: 1