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!

Ogłoszenie

Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.

#1  2013-06-10 14:55:49

  redelek - Członek DUG

redelek
Członek DUG
Skąd: Warszawa
Zarejestrowany: 2008-07-17

Wyciąganie adresów IP z access.log

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ć.

Kod:

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


Pozdrawiam
Redelek
--------------------------------------------------------
Polecam hosting ViPower https://vipower.pl/panel/aff.php?aff=208, TikTalik https://tiktalik.com/pl/

Offline

 

#2  2013-06-10 15:38:05

  megabajt - Użytkownik

megabajt
Użytkownik
Skąd: Wrocław
Zarejestrowany: 2012-03-07

Re: Wyciąganie adresów IP z access.log

Przygotuj sobie najpierw access loga, żeby nie miał duplikujących się ipków:

Kod:

cat access.log | sort -u -k1,1 > access.log.sorted

Chyba, że źle zrozumiałem :)

Offline

 

#3  2013-06-10 15:47:10

  Jacekalex - Podobno człowiek...;)

Jacekalex
Podobno człowiek...;)
Skąd: /dev/random
Zarejestrowany: 2008-01-07

Re: Wyciąganie adresów IP z access.log

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:

Kod:

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.sorted

Chyba, ż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)


W demokracji każdy naród ma taką władzę, na jaką zasługuje ;)
Si vis pacem  para bellum  ;)       |       Pozdrawiam :)

Offline

 

#4  2013-06-10 18:16:18

  Piotr3ks - Też człowiek :-)

Piotr3ks
Też człowiek :-)
Skąd: Białystok
Zarejestrowany: 2007-06-24

Re: Wyciąganie adresów IP z access.log

A jak masz w bazie zduplikowane wpisy z IP to po prostu

Kod:

SELECT DISTINCT kolumna_z_ip FROM tabela

Offline

 

Stopka forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson
Możesz wyłączyć AdBlock — tu nie ma reklam ;-)