Crawl_From_Death Δημοσ. 30 Μαΐου 2011 Δημοσ. 30 Μαΐου 2011 Καλησπερα παιδια. Εχω .log αρχεια του Apache τα οποια θα πρεπει να τα διαβασω για να εξαγω καποιες τιμες απο αυτα. Η δομη της καθε γραμμης του αρχειου ειναι η παρακατω: 66.249.68.117 - - [13/Apr/2011:00:17:46 -0700] "GET /reviews/tag/buildingsize/%CE%9C%CE%B5%CF%83%CE%B1%CE%AF%CE%BF/?criteria=2 HTTP/1.1" 200 13984 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" Ολα καλα με το ανοιγμα και το διαβασμα του αρχειου. Το διαβαζω γραμμη γραμμη και εχω προσβαση σε αυτα. Το θεμα ειναι οτι θελω με καποιον τροπο απο την καθε γραμμη να εξαγω σε διαφορετικες μεταβλητες την IP, την ημερομηνια - ωρα που εγινε η προσβαση καθως και το αρχειο που ειχε προσβαση ο χρηστης. Το εχω υλοποιησει σε PHP αλλα σε C ειμαι σκραμπας γιατι εχω να ασχοληθω κατι χρονια... Καμμια βοηθεια απο καποιον? Σας ευχαριστω
migf1 Δημοσ. 30 Μαΐου 2011 Δημοσ. 30 Μαΐου 2011 Πώς το έχεις κάνει με την PHP? Πώς έχεις διαχωρίσει τα πεδία της κάθε γραμμής;
Crawl_From_Death Δημοσ. 30 Μαΐου 2011 Μέλος Δημοσ. 30 Μαΐου 2011 Σου παραθετω τον κωδικα σε PHP ><?php $file_elements = file('access.log.0'); $single_lines = join("", $file_elements); $single_lines = preg_replace("/(\n|\r|\t)/", "", $single_lines); $records = preg_split("/([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/", $single_lines, -1, PREG_SPLIT_DELIM_CAPTURE); $size_of_rec = sizeof($records); // now split into records $i = 1; $each_rec = 0; while($i<$size_of_rec) { $ip = $records[$i]; $all = $records[$i+1]; // parse other fields preg_match("/\[(.+)\]/", $all, $match); $access_time = $match[1]; $all = str_replace($match[1], "", $all); preg_match("/\"GET (.[^\"]+)/", $all, $match); $http = $match[1]; $link = explode(" ", $http); $all = str_replace("\"GET $match[1]\"", "", $all); preg_match("/([0-9]{3})/", $all, $match); $success_code = $match[1]; $all = str_replace($match[1], "", $all); preg_match("/\"(.[^\"]+)/", $all, $match); $ref = $match[1]; $all = str_replace("\"$match[1]\"", "", $all); preg_match("/\"(.[^\"]+)/", $all, $match); $browser = $match[1]; $all = str_replace("\"$match[1]\"", "", $all); preg_match("/([0-9]+\B)/", $all, $match); $bytes = $match[1]; $all = str_replace($match[1], "", $all); print("<br>IP: $ip<br>Access Time: $access_time<br>Page: $link[0]<br>Type: $link[1]<br>Success Code: $success_code<br>Bytes Transferred: $bytes<br>Referer: $ref<br>Browser: $browser<hr>"); $i = $i + 2; $each_rec++; } ?> Το θέμα μου είναι στην C πως θα το υλοποιήσω ...
migf1 Δημοσ. 30 Μαΐου 2011 Δημοσ. 30 Μαΐου 2011 Η C δυστυχώς δεν υποστηρίζει natively regular expressions, αλλά υπάρχουν σίγουρα βιβλιοθήκες. Αν χρησιμοποιείς gcc σε περιβάλλον POSIX (unix/linux) έχει ενσωματωμένη υποστήριξη για regular expressions, μέσω του regex.h. Αλλιώς, google κι άγιος ο Θεός Ποιον C compiler χρησιμοποιείς; Αν έχεις mingw, δοκίμασε να κάνεις compile τη βιβλιοθήκη που σου επισυνάπτω mingw-regex.tar.gz
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.