강좌
클라우드/리눅스에 관한 강좌입니다.
리눅스 분류

특정 패턴문자를 원하는 포맷으로 처리하는 awk 실무활용 4편

작성자 정보

  • 웹관리자 작성
  • 작성일

컨텐츠 정보

본문

특정 패턴문자를 원하는 포맷으로 처리하는 awk 실무활용 4




ㅇ 제작 : 리눅스포털 수퍼유저코리아(www.superuser.co.kr) 박성수


ㅇ 본 자료의 자세한 모든 정보는 http://www.superuser.co.kr/linuxcommandbible/ 에서 확인하시기 바랍니다.

ㅇ 본 자료의 수정 및 편집은 허용되지않습니다.





7: 각각 다른 여러디렉토리 내에 동일한 파일을 vi로 수정하는 명령어 만들기


좀 황당한 시도일런지는 모르겠습니다. 일반사용자에게는 그다지 유용하지 않을 수 있지만 여러분과 저 같은 서버관리자들에게는 매우 유용한 방법이라 생각하기에 설명해 드립니다.


, 여러 개의 서로 다른 디렉토리내에 동일한 프로그램이나 어플리케이션이 설치되어 있는 경우에는 디렉토리 이름은 다르지만 각각의 디렉토리내에 들어있는 파일들은 모두 동일할 것입니다. 따라서 서로 다른 디렉토리내에 존재하는 동일한 이름의 파일을 한꺼번에 수정하는 vi명령어(쉘스크립트)를 만들어 실행하면 여러 번 사용해야하는 vi명령어를 한번의 명령어로 해결 할 수 있습니다. 물론 각각 vi가 오픈한 후에 수정해야 할 내용은 직접해야겠지요.


, 그럼 이와 같은 상황에서 awk를 이용하여 vi명령어를 생성해 보도록 하겠습니다. 현재 위치에는 여러 개의 서로 다른 이름의 디렉토리가 존재하고 그 각각의 디렉토리 내에 존재하는 post.html파일을 수정하기 위한 것입니다. 아래와 같이 awk를 이용하여 “vi 디렉토리명/post.html”와 같은 출력을 얻을 수 있습니다.


[root@file home]# ls -l | grep "^d" | awk '{print "vi "$9"/post.html"}'
vi aceace/post.html
vi anymore/post.html
vi bankcd/post.html
vi belpex/post.html
vi celvise/post.html
vi charge/post.html
vi clubcm/post.html
vi daesung/post.html
vi darun/post.html
vi dfc21/post.html
vi dongnam/post.html
vi doom4/post.html
vi dotoru/post.html
vi ds3etc/post.html
vi ds5ezp/post.html
vi easy8105/post.html
vi event/post.html
vi feelhouse/post.html
vi fishing/post.html
[root@file home]#


이제 위의 결과로 출력된 vi문들을 모두 복사하여 임의의 파일로 저장하시면 됩니다. 필자의 경우에는 이 파일의 이름을 modfile.sh라고 하였습니다. 주의하실 것은 쉘스크립트로 실행할 것이므로 맨 첫번째 행에는 “#!/bin/bash”를 넣어주셔야 한다는 것입니다.


#!/bin/bash

vi aceace/post.html
vi anymore/post.html
vi bankcd/post.html
vi belpex/post.html
vi celvise/post.html
vi charge/post.html
vi clubcm/post.html
vi daesung/post.html
vi darun/post.html
vi dfc21/post.html
vi dongnam/post.html
vi doom4/post.html
vi dotoru/post.html
vi ds3etc/post.html
vi ds5ezp/post.html
vi easy8105/post.html
vi event/post.html
vi feelhouse/post.html
vi fishing/post.html


그리고 아래와 같이 저장한 파일에 실행퍼미션을 주십시요.


[root@file home]# chmod 755 modfile.sh


그런다음 이제 아래의 예와 같이 modfile.sh를 실행하시면 됩니다.


[root@file home]# ./modfile.sh


위와같이 실행하시면 서로다른 디렉토리에 존재하는 동일한 이름의 파일들을 대상으로 vi명령어를 차례대로 자동수행할 수 있습니다.



이 방법은 여러사용자가 함께 사용하는 호스팅서버에서 각각 다른 디렉토리내에 존재하는 동일한 파일을 vi로 차례대로 오픈하여 수정하는 방법을 생각하던 중 시도해 보았던 방법인데 필자의 이 작은 경험이 여러분들의 서버관리에 유용하게 쓰일 수 있을 것 같아서 설명한 것입니다.




8: 아파치 웹로그파일(access_log)에서 유일방문자수 카운트하기(유일 IP주소 카운트)


서버관리자들에게 있어서 로그파일의 의미는 아무리 강조하여도 지나치지 않을 것입니다.
그중에서도 웹로그파일은 웹방문자들의 숫자를 카운트하거나 웹페이지별 방문자를 분석하는 등의 작업을 할 수가 있는 매우 유용한 파일입니다.


이번 장에서는 서버관리자들에게 흔히 요구되는 것이 홈페이지의 유일IP방문자숫자를 확인해 달라는 것입니다. 물론, 유일 IP를 카운트하여 분석하는 작업이 경력있는 서버관리자들에게는 별 어려움 없는 일이겠지만 초보관리자들을 가끔씩 힘겹게하는 일이 될 수도 있습니다.


또한, webalizeraccesswatch등의 웹로그 분석프로그램을 사용하여 분석한다면 이또한 매우 쉬운 일입니다. 하지만, 필자가 여기서 알려드리고자 하는 방법은 서버관리자가 간단한 명령어로 유일 IP를 뽑아내는 방법에 대한 것입니다.


, 그럼 먼저 우리가 흔히 볼 수 있는 웹로그파일의 이름이 access_log입니다.

그리고 이 파일의 내용을 간단히 보면 다음과 같은 형식을 가지고 있습니다. , 각행의 첫번째 항목이 IP주소라는 것을 확인하시기 바랍니다.


[root@host1 logs]# ls -l
합계 92408
-rw-r--r--    1 root     root     94525796  9
25 21:46 access_log
[root@host1 logs]#
[root@host1 logs]# tail access_log
221.150.53.43 - - [25/Sep/2003:21:41:38 +0900] "GET /images/products/F0100213a.jpg HTTP/1.1" 200 3534
221.150.53.43 - - [25/Sep/2003:21:41:38 +0900] "GET /images/products/F0100214a.jpg HTTP/1.1" 200 3580
221.150.53.43 - - [25/Sep/2003:21:41:38 +0900] "GET /images/products/F0100215a.jpg HTTP/1.1" 200 3601
221.150.53.43 - - [25/Sep/2003:21:41:38 +0900] "GET /images/products/F0100216a.jpg HTTP/1.1" 200 3412
221.150.53.43 - - [25/Sep/2003:21:41:38 +0900] "GET /images/products/F0100217a.jpg HTTP/1.1" 200 3362
221.150.53.43 - - [25/Sep/2003:21:41:39 +0900] "GET /images/products/F0100218a.jpg HTTP/1.1" 200 3507
221.150.53.43 - - [25/Sep/2003:21:41:39 +0900] "GET /images/products/F0100219a.jpg HTTP/1.1" 200 3507
221.150.53.43 - - [25/Sep/2003:21:41:41 +0900] "GET /shopping.php?page=11&keyfield=&key=&bigcode=F&midcode=F01 HTTP/1.1" 200 28235
221.150.53.43 - - [25/Sep/2003:21:41:41 +0900] "GET /images/products/F0100220a.jpg HTTP/1.1" 200 3202
221.150.53.43 - - [25/Sep/2003:21:41:41 +0900] "GET /images/products/F0100221a.jpg HTTP/1.1" 200 3202
[root@host1 logs]#


, 그럼 이제 아래와 같은 명령어로 access_log파일의 전체 유일IP를 뽑아내 보겠습니다.


[root@host1 logs]# cat access_log | awk '{print $1}' > imsi ; sort -u imsi > imsi3 ; wc -l imsi3
   4249 imsi3
[root@host1 logs]#


위와 같이 하면 현재의 access_log파일에 유일 IP주소를 카운트할 수 있습니다. 결론적으로 위의 결과에서 웹페이지를 방문한 유일IP주소가 4249개이므로 유일방문자수가 4249명이라는 것을 알 수가 있습니다.


위의 명령어를 간단히 복사하신 다음 여러분들의 access_log파일이 존재하는 곳에서 그대로 해보시기 바랍니다.

위의 명령어에 대한 설명을 간단히 하면 다음과 같습니다.

cat access_log
access_log
파일전체를 출력합니다.


awk '{print $1}' > imsi 
로그파일의 맨 첫번째 항목인 IP주소부분만을 imsi파일에 저장합니다.


sort -u imsi > imsi3
imsi
파일에 저장된 IP주소들을 유일한 IP로 정렬한 후에 이 데이터를 imsi3에 저장합니다. , imsi3파일에는 중복되지않은 유일IP주소리스트들이 저장됩니다.


wc -l imsi3
imsi3
에 저장된 행(행단위로 IP가 저장되어 있음)을 카운트합니다.


좀 복잡해 보이지만 명령어를 이해한 다음 한번 사용해 보시면 금방 익숙해 질 수 있습니다.

그리고 이런 복합적인 명령어를 자주 사용하시다 보면 서버작업을 매우 간편하게 할 수도 있습니다.

위와 같이 명령어 몇개를 조합하여 유일IP주소를 카운트 하고 있지 않습니까.

 

, 이번에는 특정 일자에 해당하는 유일IP주소를 카운트하는 방법입니다.

[root@host1 logs]# grep 20/Sep/2003 access_log | awk '{print $1}' > imsi ; sort -u imsi > imsi3 ; wc -l imsi3
     75 imsi3
[root@host1 logs]#


, 위의 결과로 보아 2003920일자에 웹페이지를 방문한 유일방문자수는 75명이라는 것을 알 수 있습니다.



위의 명령어를 간단히 설명하면 다음과 같습니다.

grep 20/Sep/2003 access_log 
access_log
파일에서 20/Sep/2003이라는 문자열들을 가진행만을 뽑아냅니다. , 특정 날짜에 해당하는 문자가 들어있는 행만을 작업대상으로 뽑아낸 것입니다.

awk '{print $1}' > imsi
20/Sep/2003
에 해당하는 행들에서 IP주소부분만을 뽑아서 imsi파일에 저장합니다.

sort -u imsi > imsi3
imsi
파일에 저장된 데이터를 대상으로 유일데이터 정렬을 하여 imsi3에 저장합니다 .

wc -l imsi3
imsi3
의 행의 수를 카운트합니다.

이렇게하면 특정날짜의 유일IP주소를 카운트할 수있습니다.


여러분들께서도 위와 같은 방법으로 테스트해보시기 바랍니다. 위에서 20/Sep/2003 라고 된 부분은 2003920일자라는 의미입니다. , access_log파일 전체에서 2003920일자의 유일IP방문자수는 75명이 된다는 의미입니다.


만약 다른날짜의 유일IP방문자수를 카운트하고자 한다면 다음과 같이 일자부분과 월, 년부분을 바꾸어 주시면 됩니다. 아래는 2003921일자 유일IP방문자 수 입니다.


[root@host1 logs]# grep 21/Sep/2003 access_log | awk '{print $1}' > imsi ; sort -u imsi > imsi3 ; wc -l imsi3
     67 imsi3
[root@host1 logs]#


다음은 2003922일자 유일IP방문자 수입니다.


[root@host1 logs]# grep 22/Sep/2003 access_log | awk '{print $1}' > imsi ; sort -u imsi > imsi3 ; wc -l imsi3
     90 imsi3
[root@host1 logs]#


필자가 예로든 awk명령어들은 모두 실제 예입니다. 따라서 그대로 따라해 보셔도 무리없이 실행이 됨을 알 수 있습니다. , 위의 예와 같이 날짜부분에서 월에 해당하는 문자들은 9월이기때문에 Sep가 된 것이지만, 만약 7월이라면 Jul이 되며, 8월이라면 Aug등으로 해주셔야합니다. 이 부분만 정확하게 알고 계신다면 다양한 응용이 가능합니다.



리눅스포털 –수퍼유저코리아- www.superuser.co.kr


관련자료

댓글 0
등록된 댓글이 없습니다.

공지사항


뉴스광장


  • 현재 회원수 :  60,041 명
  • 현재 강좌수 :  35,855 개
  • 현재 접속자 :  100 명