'Linux'에 해당되는 글 2건

  1. 2008/11/24 awk 실무활용 4편
  2. 2008/11/24 awk 실무활용 3편
2008/11/24 10:42

ㅇ 제작 : 리눅스포털 수퍼유저코리아(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

저작자 표시

'IT' 카테고리의 다른 글

Aqau Data Studio - 모든 RDBMS를 한 번에 관리하자.  (0) 2010/02/12
[라이트룸] 마음에드는 preset 발견  (0) 2010/01/13
Wide 듀얼 모니터에 유용한 유틸 WinSplit Revolution  (0) 2008/12/22
awk 실무활용 4편  (0) 2008/11/24
awk 실무활용 3편  (0) 2008/11/24
awk 실무활용 2편  (0) 2008/11/24
awk 실무활용 1편  (0) 2008/11/24
XP Themes  (0) 2008/10/06
Posted by 형준군
2008/11/24 10:38

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


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

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





6: /home디렉토리의 각 계정별로 압축하는 명령어 만들기


다음은 특정디렉토리(예에서는 /home)내에 존재하는 각각의 계정별로 tar로 압축하는 명령어를 만드는 방법입니다.

, grep명령어와 awk를 활용하면 이와 같은 작업을 굉장히 쉽게 작업을 할 수 있습니다.


, 이번 예에서는 다음과 같은 작업을 하기위한 명령어(쉘스크립트)를 생성하는 것이 목적이됩니다.


목적 : /backup디렉토리내에 /home에 존재하는 각각의 계정들별로 "ID.tar.gz"라는 파일로 tar로 압축을 하고자 함.


이와 같은 작업을 하기위하여 필자는 아래와 같은 명령어를 사용합니다.


ls -l /home | grep "^d" | awk '{print "tar cvfpz " $9"\.tar\.gz" " \/home\/"$9}'


이 명령어는 모두 "|"(파이프명령어)로 구분되는 3개의 명령어가 한번에 실행이 됩니다.


먼저 "ls -l /home"/home에 있는 모든 파일리스트들이 출력이 될 것입니다.


그리고 "grep "^d" "/home내의 디렉토리 목록만 출력이 됩니다. 이것은 각각의 계정들은 모두 /home내의 디렉토리를 가지고 있기 때문입니다.


그리고 이런 결과는 그 뒤에 나오는 awk의 입력으로 들어가게 됩니다. 그뒤의 awk명령어는 넘어온 각각의 행들에서 'tar cvfpz ID.tar.gz /home/ID"라는 결과를 각각 만들어 출력합니다. 만약 필자가 사용한 awk명령어가 이해되지 않는다면 그대로 복사해서 사용하셔도 무방합니다.


, 필자가 사용한 awk명령어들은 외우는 것이 아니라 목적한 조건에 맞도록 적절히 생성하여 사용하는 것이므로 외우는 것은 올바른 공부가 아닙니다. 필자와 같이 awk명령어를 마음대로 사용하는 것이 어렵다면 그대로 복사해서 사용하셔도 되겠지만 그 의미는 정확하게 이해하고있어야 합니다.


이와 같은 awk명령어의 결과로 다음과 같은 결과를 얻었습니다.


[root@file backup]# ls -l /home | grep "^d" | awk '{print "tar cvfpz " $9"\.tar\.gz" " \/home\/"$9}'

tar cvfpz bible.tar.gz /home/bible

tar cvfpz jinious.tar.gz /home/jinious

tar cvfpz locli.tar.gz /home/locli

tar cvfpz lost+found.tar.gz /home/lost+found

tar cvfpz mysql.tar.gz /home/mysql

tar cvfpz public.tar.gz /home/public

tar cvfpz samba.tar.gz /home/samba

tar cvfpz sspark.tar.gz /home/sspark

tar cvfpz test01.tar.gz /home/test01

tar cvfpz test02.tar.gz /home/test02

tar cvfpz test03.tar.gz /home/test03

tar cvfpz working.tar.gz /home/working

[root@file backup]#


이제 앞의 예에서 보았듯이 이 결과를 실행하는 간단한 쉘파일(backup.sh)을 생성합니다. 이때, 한가지 주의하실 것은 위의 결과에서 "lost+found"라는 행은 제외해 주시기 바랍니다.

이 행은 있어도 상관없지만 백업할 의미가 없는 것이므로 제외하였습니다.


아래와 같이 필자는 이 쉘파일을 backup.sh라는 이름으로 아래와 같이 vi를 이용하여 생성하였습니다. vi를 이용하여 생성할 때에는 맨 첫번째 행에는 반드시 "#!/bin/bash"를 넣어 주시기 바랍니다.


[root@file backup]# vi backup.sh


#!/bin/bash

tar cvfpz bible.tar.gz /home/bible

tar cvfpz jinious.tar.gz /home/jinious

tar cvfpz locli.tar.gz /home/locli

tar cvfpz mysql.tar.gz /home/mysql

tar cvfpz public.tar.gz /home/public

tar cvfpz samba.tar.gz /home/samba

tar cvfpz sspark.tar.gz /home/sspark

tar cvfpz test01.tar.gz /home/test01

tar cvfpz test02.tar.gz /home/test02

tar cvfpz test03.tar.gz /home/test03

tar cvfpz working.tar.gz /home/working

~

~

~

~

~

~

~

~

~

~

~

~

~

"backup.sh" 12L, 415C written

[root@file backup]#


그리고 생성한 backup.sh 쉘파일에 아래와 같이 실행퍼미션(700)을 설정한 다음 /backup위치에서 실행(./backup.sh)을 하였습니다. 아래 실행결과를 보시는 바와같이 실행결과의 길이가 너무 길어지므로 중간에서 생략하였습니다.


[root@file backup]# chmod 700 backup.sh

[root@file backup]#

[root@file backup]# ./backup.sh

tar: Removing leading `/' from member names

home/bible/

home/bible/.bash_logout

home/bible/.bash_profile

home/bible/.bashrc

home/bible/.emacs

home/bible/.gtkrc

home/bible/.bash_history

home/bible/.viminfo

home/bible/www/

home/bible/www/index.html

tar: Removing leading `/' from member names

home/jinious/

home/jinious/.bash_logout

home/jinious/.bash_profile

home/jinious/.bashrc

home/jinious/.emacs

home/jinious/.gtkrc

home/jinious/www/

tar: Removing leading `/' from member names

home/locli/

home/locli/.bash_logout

home/locli/.bash_profile

home/locli/.bashrc

home/locli/.emacs

home/locli/.gtkrc

home/locli/www/

home/locli/www/1.php

home/locli/www/phpm/

home/locli/www/phpm/css/

home/locli/www/phpm/css/phpmyadmin.css.php

home/locli/www/phpm/images/

home/locli/www/phpm/images/arrow_ltr.gif

home/locli/www/phpm/images/arrow_rtl.gif

home/locli/www/phpm/images/asc_order.png

home/locli/www/phpm/images/browse.png

home/locli/www/phpm/images/button_browse.png

home/locli/www/phpm/images/button_drop.png

....

중략


참고로 이런 실행결과 메시지들을 콘솔(모니터 화면)로 출력하지 않으려면 다음과 같이 하시면 됩니다.


[root@file backup]# ./backup.sh >& /dev/null


이 의미는 실행과정에서 출력되는 메시지들을 모두 "/dev/null"("널터미널", 일종의 쓰레기통)로 버리라는 의미이므로 실행과정 중 출력되는 메시지들은 나타나지 않고 정상적인 실행만하게 됩니다.


이렇게하여 압축된 결과를 확인해 보시면 다음과 같습니다.


[root@file backup]# ls -l

total 2888440

-rwx------ 1 root root 415 Nov 13 23:46 backup.sh

-rw-r--r-- 1 root root 1591 Nov 13 23:47 bible.tar.gz

-rw-r--r-- 1 root root 1006 Nov 13 23:47 jinious.tar.gz

-rw-r--r-- 1 root root 1807845 Nov 13 23:47 locli.tar.gz

-rw-r--r-- 1 root root 970 Nov 13 23:47 mysql.tar.gz

-rw-r--r-- 1 root root 967 Nov 13 23:47 public.tar.gz

-rw-r--r-- 1 root root 2749180960 Nov 14 00:20 samba.tar.gz

-rw-r--r-- 1 root root 1008 Nov 14 00:20 sspark.tar.gz

-rw-r--r-- 1 root root 1040 Nov 14 00:20 test01.tar.gz

-rw-r--r-- 1 root root 1045 Nov 14 00:20 test02.tar.gz

-rw-r--r-- 1 root root 1042 Nov 14 00:20 test03.tar.gz

-rw-r--r-- 1 root root 203830279 Nov 14 00:23 working.tar.gz

[root@file backup]#


위와 같이 /home내에 존재하는 각각의 계정별로 모두 압축되어 저장된 것을 확인할 수 있을 것입니다.


물론, /home을 통째로 압축하는 방법이 보다 간단하지만 반드시 각각의 계정별로 압축저장을 해야하는 경우도 종종 발생합니다. 이런 경우에 요긴하게 사용하시기 바랍니다

저작자 표시

'IT' 카테고리의 다른 글

[라이트룸] 마음에드는 preset 발견  (0) 2010/01/13
Wide 듀얼 모니터에 유용한 유틸 WinSplit Revolution  (0) 2008/12/22
awk 실무활용 4편  (0) 2008/11/24
awk 실무활용 3편  (0) 2008/11/24
awk 실무활용 2편  (0) 2008/11/24
awk 실무활용 1편  (0) 2008/11/24
XP Themes  (0) 2008/10/06
vi 편집기  (0) 2008/06/11
Posted by 형준군