Προς το περιεχόμενο

C και Regular Expressions


Crawl_From_Death

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλησπερα παιδια.

 

Εχω .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 ειμαι σκραμπας γιατι εχω να ασχοληθω κατι χρονια...

 

Καμμια βοηθεια απο καποιον? :)

 

Σας ευχαριστω

Δημοσ.

Σου παραθετω τον κωδικα σε 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 πως θα το υλοποιήσω ...

Δημοσ.

Η C δυστυχώς δεν υποστηρίζει natively regular expressions, αλλά υπάρχουν σίγουρα βιβλιοθήκες. Αν χρησιμοποιείς gcc σε περιβάλλον POSIX (unix/linux) έχει ενσωματωμένη υποστήριξη για regular expressions, μέσω του regex.h.

 

Αλλιώς, google κι άγιος ο Θεός :)

 

Ποιον C compiler χρησιμοποιείς; Αν έχεις mingw, δοκίμασε να κάνεις compile τη βιβλιοθήκη που σου επισυνάπτω

mingw-regex.tar.gz

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...