본문 바로가기

개발이야기

shell script - apache access log에서 접근 url top 10 추출하기

아래와 같은 apache access log가 존재한다고 가정하자

테스트 데이터

test_apache_log.txt
0.03MB

127.0.0.1 - - [10/Feb/2019:11:11:55 +0000] "GET / HTTP/1.1"
10.10.30.3 - - [10/Oct/2018:13:55:36 -0700] "GET /apache_pb.gif"
10.10.30.2 - - [10/Oct/2019:13:55:36 -0100] "GET /two.html"
...
...

상기 apache access log 중 log 앞에 있는 access ip를 뽑아서 top 10을 script로 뽑으려면 어떻게 해야할까?

1. cat과 awk로 ip만 추출

명령어

$ cat test_apache_log.txt|awk '{print $1}'

cat과 awk를 통해 아래와 같이 ip만 추출가능하다

결과물

10.20.10.1
10.20.10.5
10.20.10.4
10.20.10.5
10.20.10.4
10.20.10.5
10.20.10.4
10.20.30.6
10.20.30.3
10.20.30.6
10.20.30.3
10.20.30.6
10.10.1.4
10.10.55.2
127.0.0.1
10.10.30.3
10.10.30.6
...
...

2. sort와 uniq 로 각 값의 개수 추출

명령어

$ cat test_apache_log.txt|awk '{print $1}'|sort -n | uniq -c

uniq -c는 연속으로 중복된 행을 하나의 행으로 만들어준다. 그러므로 sort -n을 통해 1번에서 추출한 데이터를 소팅하고 uniq -c로 연속된 행을 하나의 행으로 만들고 숫자를 추출 할 수 있다.(연속된 행이 몇개인지)

결과물

  11 10.10.1.4
   8 10.10.30.2
  18 10.10.30.3
  10 10.10.30.6
  11 10.10.55.2
  56 10.20.10.1
  80 10.20.10.4
  18 10.20.10.5
 118 10.20.30.3
 118 10.20.30.6
  20 127.0.0.1

3. sort 로 개수 정렬

명령어

$ cat test_apache_log.txt|awk '{print $1}'|sort -n | uniq -c | sort -rn

2에서 추출된 결과물을 sort -rn을 통해 내림차순 정렬한다

결과물

 118 10.20.30.6
 118 10.20.30.3
  80 10.20.10.4
  56 10.20.10.1
  20 127.0.0.1
  18 10.20.10.5
  18 10.10.30.3
  11 10.10.55.2
  11 10.10.1.4
  10 10.10.30.6
   8 10.10.30.2

4. head 로 상위 top 10 추출

명령어

$ cat test_apache_log.txt|awk '{print $1}'|sort -n | uniq -c | sort -rn | head -n 10

3에서 추출된 결과물에서 head -n을 통해 상위 n개의 행을 출력한다

결과물

 118 10.20.30.6
 118 10.20.30.3
  80 10.20.10.4
  56 10.20.10.1
  20 127.0.0.1
  18 10.20.10.5
  18 10.10.30.3
  11 10.10.55.2
  11 10.10.1.4
  10 10.10.30.6

End of Document