ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • SK쉴더스 루키즈 6일차 - 파이썬 모듈, numpy
    정보 보안 2025. 6. 13. 19:47

    오늘은 파이썬의 모듈 numpy, matlab 등의 기술들을 배웠다.

     

    import re # 정규표현식(re) 모듈을 불러옴 - IP 주소 추출에 사용됨
    import csv # CSV 파일 저장용 모듈
    import os # 파일 존재 여부 확인용 모듈
    from collections import Counter  # 리스트에서 개수 세기 쉽게 해주는 Counter 클래스

    # 로그 파일에서 IP 주소를 추출하는 함수
    def extract_ip_addresses(file_path):  # file_path: 분석할 로그 파일 경로
        if not os.path.exists(file_path):  # 파일이 존재하지 않으면
            print("파일이 존재하지 않습니다.")  # 에러 메시지 출력
            return []  # 빈 리스트 반환하고 함수 종료

        with open(file_path, 'r', encoding='utf-8') as f:  # 파일을 UTF-8로 읽기 모드로 열기
            log_data = f.read()  # 전체 로그 텍스트 읽기

        ip_pattern = r'\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b'  # IPv4 형식에 맞는 정규표현식
        ip_list = re.findall(ip_pattern, log_data)  # 정규식으로 IP 주소 리스트 추출

        return ip_list  # 추출된 IP 주소 리스트 반환

    # 가장 많이 등장한 IP 주소 N개를 뽑는 함수
    def count_top_ips(ip_list, top_n=3):  # ip_list: 추출된 IP 목록, top_n: 출력할 개수 기본 3
        ip_counter = Counter(ip_list)  # IP 주소들의 등장 횟수를 세어줌
        return ip_counter.most_common(top_n)  # 가장 많이 등장한 상위 top_n개 반환

    # 결과를 CSV 파일로 저장하는 함수
    def save_to_csv(ip_data, output_file='ip_analysis.csv'):  # ip_data: [('ip', 횟수), ...] 리스트
        with open(output_file, 'w', newline='', encoding='utf-8') as f:  # CSV 파일 쓰기 모드 열기
            writer = csv.writer(f)  # CSV 작성자 객체 생성
            writer.writerow(['IP Address', 'Count'])  # 첫 줄에 헤더 작성
            for ip, count in ip_data:  # IP와 빈도를 하나씩 꺼내서
                writer.writerow([ip, count])  # 한 줄씩 CSV에 작성
        print(f"CSV 저장 완료: {output_file}")  # 저장 완료 메시지 출력

    # 메인 실행 함수
    def main():

        log_path = input("로그 파일 경로를 입력하세요: ").strip()  # 사용자로부터 로그 경로 입력받기
        ip_list = extract_ip_addresses(log_path)  # 로그에서 IP 추출

        if not ip_list:  # 추출된 IP가 없다면
            print("IP를 찾지 못했습니다.")  # 에러 메시지 출력
            return  # 종료

        top_ips = count_top_ips(ip_list, 3)  # 상위 3개 IP 추출
        print("\n상위 3개 IP 주소:")  # 결과 안내 출력
        for ip, count in top_ips:  # 하나씩 출력
            print(f"{ip}: {count}회")  # IP와 빈도 출력

        save_to_csv(top_ips)  # CSV 파일로 저장

    # 스크립트가 직접 실행될 때만 main() 실행
    if __name__ == "__main__":
        main()  # 메인 함수 호출

     

    ip들이 들어있는 로그파일을 분석하는 2번째 문제를 해결했다.

     

Designed by Tistory.