#include #include #include #include #include #include class log_entry { public: std::string ip; std::string timestamp; std::string request; std::string status; std::string bytes; std::string referer; std::string os; std::string browser; log_entry(const std::smatch& match) { ip = match[1].str(); timestamp = match[2].str(); request = match[3].str(); status = match[4].str(); bytes = match[5].str(); referer = match[6].str(); std::string raw_ua = match[7].str(); if (raw_ua.find("Windows NT 10.0") != std::string::npos) os = "Windows 10/11"; else if (raw_ua.find("Windows NT 6.1") != std::string::npos) os = "Windows 7"; else if (raw_ua.find("iPhone") != std::string::npos) os = "iOS (iPhone)"; else if (raw_ua.find("iPad") != std::string::npos) os = "iOS (iPad)"; else if (raw_ua.find("Android") != std::string::npos) os = "Android"; else if (raw_ua.find("Macintosh") != std::string::npos) os = "macOS"; else if (raw_ua.find("Linux") != std::string::npos) os = "Linux"; else os = "Unknown OS"; if (raw_ua.find("Edg/") != std::string::npos) browser = "Microsoft Edge"; else if (raw_ua.find("OPR/") != std::string::npos) browser = "Opera"; else if (raw_ua.find("Chrome/") != std::string::npos) browser = "Google Chrome"; else if (raw_ua.find("Safari/") != std::string::npos) browser = "Apple Safari"; else if (raw_ua.find("Firefox/") != std::string::npos) browser = "Mozilla Firefox"; else if (raw_ua.find("curl/") != std::string::npos) browser = "curl (CLI Tool)"; else browser = "Unknown Browser/Bot"; } }; int main(int argc, char* argv[]) { std::ifstream file(argv[1]); if(!file.is_open()) { std::cerr << "Error loading " << argv[1] << std::endl; return 1; } std::vector lines; std::string line; while(std::getline(file, line)){ lines.push_back(std::move(line)); } file.close(); std::vector all_logs; std::regex log_pattern(R"((\S+)\s+-\s+-\s+\[([^\]]+)\]\s+\"([^\"]+)\"\s+(\d+)\s+(\d+|-)\s+\"([^\"]*)\"\s+\"([^\"]*)\")"); for(const auto& log_line : lines) { std::smatch match; if(std::regex_search(log_line, match, log_pattern)) { all_logs.emplace_back(match); } } for (size_t i = 0; i < all_logs.size(); ++i) { std::cout << "Entry #" << i + 1 << ":\n" << " IP: " << all_logs[i].ip << "\n" << " OS: " << all_logs[i].os << "\n" << " Browser: " << all_logs[i].browser << "\n" << " Status: " << all_logs[i].status << "\n\n"; } return 0; }