Bash 셸을 사용하여 Apache 로그 구문 분석

- bash 셸(버전 5.0)을 사용하여 Apache 로그를 구문 분석하여 일일 요청 및 IP당 요청에 대한 통계를 인쇄합니다. 해커랭크 코드



작업: Apache 액세스 로그 파일을 구문 분석하고 분석하는 Bash 스크립트를 만듭니다. 로그 파일의 경로는 스크립트(LOG_FILE)의 입력입니다. solution.sh /var/log/access.log상위 10개 결과로 제한되고 선행 공백 없이 가장 높은 값에서 가장 낮은 값으로 숫자로 정렬된 두 가지 통계를 출력해야 하며 키 값이 더 큰 행은 나중에 출력되는 대신 출력에서 ​​먼저 나타납니다.
스크립트는 두 결과를 차례로 출력해야 하며 각 행은 공백이나 표를 구분 기호로 사용하여 QUANTITY FILED 형식이어야 합니다.
  • Apache 로그에는 다음 예제 콘텐츠가 있습니다.

  • 172.19.0.100 - - [15/Feb/2020:22:32:02 +0000] "GET /index HTTP/1.1" 200 14034 "-" "Mozilla/5.0 (compatible; SemrushBot/6~bl; +http://www.semrush.com/bot.html)" "172.19.0.4"
    172.19.0.100 - - [16/Feb/2020:22:31:32 +0000] "GET /site HTTP/1.1" 200 36565 "https://command-not-found.com/curl" "Mozilla/5.0+(compatible; UptimeRobot/2.0; http://www.uptimerobot.com/)" "172.19.0.3"
    172.19.0.101 - - [16/Feb/2020:22:30:10 +0000] "GET /credits HTTP/1.1" 200 31067 "-" "Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)" "172.19.0.2"
    172.19.0.102 - - [17/Feb/2020:22:30:10 +0000] "GET /index HTTP/1.1" 200 31067 "-" "Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)" "172.19.0.2"
    172.19.0.100 - - [18/Feb/2020:22:35:10 +0000] "GET /index HTTP/1.1" 200 31067 "-" "Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)" "172.19.0.2"
    

  • 예상 결과:

  • 2 16/Feb/2020
    1 18/Feb/2020
    1 17/Feb/2020
    1 15/Feb/2020
    
    3 172.19.0.100
    1 172.19.0.102
    1 172.19.0.101
    

  • 스크립트는 다음으로 시작합니다.

  • #!/usr/bin/env bash
    LOG_FILE="$1"
    

  • 여기에 자신의 솔루션을 작성하거나 참조하십시오.

  • https://github.com/vumdao/bash/blob/master/codility/solution.sh

    #!/usr/bin/env bash
    LOG_FILE="$1"
    
    function request_per_day() {
        declare -A day_array
        while read line; do
            day=$(echo "$line" | sed 's/.*\[//g;s/].*//g;s/:.*//g')
            if [[ -v day_array[$day] ]]; then
                day_array[$day]=$((day_array[$day]+1))
            else
                day_array[$day]=1
            fi
        done < $LOG_FILE
    
        for day in ${!day_array[@]}; do echo ${day_array[$day]} $day; done | sort -rn | head -10
    }
    
    function request_per_ip() {
        declare -A ip_array
        while read line; do
            ip=$(echo $line | awk '{print $1}')
            if [[ -v ip_array[$ip] ]]; then
                ip_array[$ip]=$((ip_array[$ip]+1))
            else
                ip_array[$ip]=1
            fi
        done < $LOG_FILE
    
        for ip in ${!ip_array[@]}; do echo ${ip_array[$ip]} $ip; done | sort -rn | head -10
    }
    
    request_per_day
    echo ""
    request_per_ip
    


    · 깃허브 · 편물 · · · 페이지 ·

    좋은 웹페이지 즐겨찾기