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
Time (s) | Query |
---|---|
0.00010 | SET CHARSET latin2 |
0.00005 | SET NAMES latin2 |
0.00106 | SELECT u.*, g.*, o.logged FROM punbb_users AS u INNER JOIN punbb_groups AS g ON u.group_id=g.g_id LEFT JOIN punbb_online AS o ON o.ident='3.133.107.11' WHERE u.id=1 |
0.00062 | REPLACE INTO punbb_online (user_id, ident, logged) VALUES(1, '3.133.107.11', 1732280603) |
0.00040 | SELECT * FROM punbb_online WHERE logged<1732280303 |
0.00081 | SELECT t.subject, t.closed, t.num_replies, t.sticky, f.id AS forum_id, f.forum_name, f.moderators, fp.post_replies, 0 FROM punbb_topics AS t INNER JOIN punbb_forums AS f ON f.id=t.forum_id LEFT JOIN punbb_forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id=3) WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.id=10305 AND t.moved_to IS NULL |
0.00005 | SELECT search_for, replace_with FROM punbb_censoring |
0.00213 | SELECT u.email, u.title, u.url, u.location, u.use_avatar, u.signature, u.email_setting, u.num_posts, u.registered, u.admin_note, p.id, p.poster AS username, p.poster_id, p.poster_ip, p.poster_email, p.message, p.hide_smilies, p.posted, p.edited, p.edited_by, g.g_id, g.g_user_title, o.user_id AS is_online FROM punbb_posts AS p INNER JOIN punbb_users AS u ON u.id=p.poster_id INNER JOIN punbb_groups AS g ON g.g_id=u.group_id LEFT JOIN punbb_online AS o ON (o.user_id=u.id AND o.user_id!=1 AND o.idle=0) WHERE p.topic_id=10305 ORDER BY p.id LIMIT 0,25 |
0.00080 | UPDATE punbb_topics SET num_views=num_views+1 WHERE id=10305 |
Total query time: 0.00602 s |