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 wszystkich :)
Mam problem i mam nadzieje, że ktoś mi pomoże heh, mianowicie. Mam plik tekstowy (dokładnie log, ze squida), którego chce sobie filtrować i w odpowiednim momencie dodawać do bazy. Już tłumacze - plik ma następującą strukturę (oto przykład):
1199857805.452 262 192.168.1.123 TCP_CLIENT_REFRESH_MISS/200 4325 GET http://u30.eset.com/nod_upd/update.ver - DIRECT/89.202.149.40 application/octet-stream
Chciałbym powyższy wpis podzielić na siedem części i załadować do bazy do odpowiedniej kolumny, która miała by strukture np:
nr1 nr2 ip tcp nr3 metoda strona
lub ewentualnie jak jest prościej to podzielić to na tyle części ile jest spacji czyli w tym przypadku 9
Problem oczywiście mam z tym, że nie wiem jak to podzielić, żeby poszczególne wpisy, załadować do odpowiednich kolumn. Może to być rozwiązanie w shellu/perlu lub w php. Ma ktoś jakiś pomysł ?? Z góry bardzo dziękuje :)
pozdrawiam
Offline
Jeżeli może być to zrobione w PHP, to możesz wykonać następującą czynność:
<?php $text="1199857805.452 262 192.168.1.123 TCP_CLIENT_REFRESH_MISS/200 4325 GET http://u30.eset.com/nod_upd/update.ver - DIRECT/89.202.149.40 application/octet-stream"; $oko = explode(" ",$text); print_r($oko); ?>
Oczywiście jeżeli w pliku jest więcej takich wersów, to musisz zastosować pętle, np. for
Offline
w shellu też prosta sprawa robić cut i wrzucać do sql, tylko z wydajnością takiego czegoś może być problem, dla każdej linijka loga siedem insertów :/
EDIT
A no i jeszcze trzeba jakiś kawałek sprawdzania, żeby nie duplikował wpisów, albo select i porównywanie tego z kolejnymi elementami, albo (i to chyba lżejsze) oznaczać w logu linijki już dodane (lub koniec ostatniej operacji dodawania) .
Ostatnio edytowany przez zielony_83 (2008-01-09 18:34:29)
Offline
w perlu możesz użyć funkcji split, przykład:
($nr1, $nr2, $ip, $tcp, $nr3, $metoda, $strona) = split(/\s*/, $linijka);
Offline
w awk:
awk '{printf("INSERT INTO ... %s %s %s %s", $1, $2, $3, $4);}' < plik > plik.sql
dla kazdej linijki w $1 $2 $3 itd laduja pola rozdzielane ciagami bialych znakow ...
Offline
dziękuje wszystkim za odpowiedzi :)
Pozdrawiam
Offline
Strony: 1