[강좌][shell] 쉘에서 자주 사용되는 명령어 -2

======================================================================

    SHELL PROGRAMMING [13]  쉘에서 자주 사용되는 명령어 -2

본 강좌는 본인의 허락없이 무단 복사하거나 타 사이트에 등록하는것을

금지 합니다.  –  서진우(alang at sysmng.com)

======================================================================

1. 시스템 관리 명령 [1] –  grep (egrep,fgrep)

다들 아시다 시피 grep 은 입력에서 주어진 패턴을 포함하고 있는 줄을 찾아

주는 명령이다. 많은 시스템 관리 명령들과 파이프(pipe)를 이용해서 사용할

수 있다. 흔히 사용하는 것은 프로세스 확인이다.

# ps aux | grep httpd

위와 같이 현재 시스템의 프로세스중 httpd 만 검색해 낸다.

만일 pipe 를 이용하여 검색할경우 검색 패턴이 한개 이상일 경우엔 egrep

을 이용하여 검색할수 있다.

# ps aux | egrep ‘httpd|mysql’

이밖에 grep 는 file 내용증에 특정 pattern 이 들어 있는 행을 찾아서 출력

해 준다 option 을 이용하여 보다 다양한 pattern을 선택하여 검색할수 있다.

option :

———————————————-

-i : 대소문자 구별을 하지 않는다.

-v : pattern 을 포함하지 않는 행만 출력한다.

-n : 행번호를 출력한다.

-l : 파일명만 출력한다.

-c : 패턴과 일치하는 라인의 갯수만 보여준다.

———————————————-

몇가지 예를 들어 보겠다.

# grep [option] “pattern” 파일명

대표적인 사용방법이다. 파일에 pattern 이란 단어를 포함하는 행을 출력한다.

# grep -v “^[ ^I]*$” 파일명

위는 공백을 제거한 파일 내용 살펴보기

# grep -v “^#*$” 파일명

위는 주석을 제거한 파일 내용 살펴보기

이밖의 패턴과 정확히 일치하는 것만을 찾아주는 fgrep 가 있다.

grep,egrep,fgrep 의 옵션으론 위의 옵션을 공통적으로 사용한다.

마지막으로 유용한 팁 하나 소개하죠. grep 는 현재 디렉토리에 존재하는 파일

만을 검색한다. 만일 현재 디렉토리와 그 하위 디렉토리까지 grep 패턴 검색을

하고자 할땐 find 명령을 이용하면 된다.

# find . -exec grep “pattern” {} \\;

2. 시스템 관리 명령어[2] –  awk

awk 는 grep 과 같이 출력된 문장에서 필요한 부분한 걸려내는 필터역활을 하는

명령어의 일종입니다. 사용하기에 따라서 매우 유용하지요..

[root@zzang911 /]# ls -al

drwxr-xr-x    2 root     root            0 11월  3 10:16 misc/

drwxr-xr-x    4 root     root         4096  8월  9 00:41 mnt/

drwxr-xr-x    2 root     root         4096  8월 24  1999 opt/

dr-xr-xr-x  113 root     root            0 11월  3 10:16 proc/

위의 출력문은 tab (공백)으로 각 컬럼을 구분하는데 다음과 같이 하면 원하는 컬럼

값만을 선택하서 출력이 가능합니다.

[root@zzang911 /]# ls -al | awk ‘{print $1 $5 $9}’

drwxrwx— 4096 root/

drwxr-xr-x 4096 sbin/

drwxr-xr-x 4096 temp/

drwxr-xr-x 4096 tftpboot/

drwxrwxrwt 4096 tmp/

drwxr-xr-x 4096 usr/

drwxr-xr-x 4096 var/

위와 같이 1,5,9 번째 컬럼값만 출력이 되어집니다. 후후후

이밖에 awk 는 연산 기능을 가지고 있다.

# find /home/design -user design -ls | \\

awk ‘{sum+=$7}; END {print “User design total disk use = ” sum }’

User design total disk use = 86072036

이와 같이 design 권한의 파일들의 크기를 합친값을 보여준다.

이 명령라인은 find 로 검색한 파일을 ls -al 형식으로 출력한후 여기서

바이트 수를 가지고 있는 7번째 열의 합계를 누적한다. 그리고 마지막줄

에 최종 결과값을 출력한다. 이밖에 awk 는 평균값도 구할수 있는데…

END 절의 sum 를 sum/NR 로 대체하면 구할수 있다. NR 은 awk 내부 변수

로서 현재까지의 입력 라인수를 갖는다.

3. 시스템 관리 명령 [3] –  find

find 명령어는 시스템 관리 명령중 가장 많이 사용되는 명령어 중 하나이다.

이 명령어의 다양한 기능을 많이 알수록 관리자의 불필요한 삽질을 최대한 줄일수

있을것이다.

option :

-atime  n : 정확히 n 일 전에 access 된 파일

-mtime  n : 정확히 n 일 전에 수정된 파일

-newer [file] : file 보다 최근에 수정된 파일

-size  n  : 정확히 n x 512 byte 의 길이를 갖는 파일

-type  c  : 파일의 종류를 기술. f: 파일 d: 디렉토리

-fstype [filesystem] : 파일 시스템 종류

-name [pattern] : 파일 이름 검색

-perm  p  : 파일 접근 퍼미션이 p 인 경우

-user  [user] : 파일 소유권이 user 인 파일

-group [group] : 파일 그룹이 group 인 파일

-nouser : 파일 소유자가 /etc/passwd 에 없는 경우  

-nogroup : 파일 소유그룹이 /etc/group 에 없는 경우

-uid  n : 파일 uid 가 n 인 경우

-gid  n : 파일 gid 가 n 인 경우

단순히 위의 옵션되로 사용하면 그렇게 유용해 보이지 않을수 있겠죠.

예를 들어 누가 정확히 3일전에 접근한 파일들을 검색하겠습니까..?

하지만 +, – 기호를 이용하여 기간,시간,크기와 같은 수치들의 범위를

지정할수가 있습니다.

+ 는 ~~보다 큰 경우, – 는 ~~ 보다 작은 경우

-mtime +7 : 수정 된지 7일이 지난 파일

-mtime -7 : 수정 된지 7일이 안된 파일

-size +100 : 50kbyte 보다 큰 파일

-name 뒤엔 인용부호 (와일드 카드 문자) 를 같이 사용할수 있다.

-name *.dat : 확장자가 dat 인 모든 파일

이런 옵션들을 차례로 기술하여 파일을 찾을 경우 AND 연산이 적용된다.

하지만 -o 옵션을 이용하여 OR 을 적용할수도 있고 ( ) 를 이용하여 그

룹을 지어 적용할수도 있다. 이밖에 NOT 연산도 가능한데 옵션 앞에 !

부호를 달아 주면 된다. 밑의 몇가지 예를 살펴 보자.

# find ./ -atime +60 -mtime 120  

( AND 논리연산으로 접근한지 60일 지난 파일중 수정한지 120 일 지난 파일 )

# find ./ \\( -user design -o -group design \\)  

(OR 논리연산으로 소유자나 그룹이 design 인경우 )

# find ./ \\( ! -user design -o ! -group design \\)

(NOT 논리연산으로 소유자나 그룹이 design 이 아닌 경우 )

-perm 옵션은 숫자형태의 특정 접근 모드를 이용하여 파일을 검색하는 옵션이다.

옵션별 사용예를 들어 보자.

-perm 75 : permission = 755

-perm -002 : 모든 사람들이 기록할수 있는 파일

-perm -4000 : SUID 액세스 설정

-perm -2000 : SGID 액세스 설정

이밖에 지원 되는 내부 옵션이 있다.

-print : 대응되는 파일의 경로명을 출력

-ls : 대응되는 파일에 대한 긴 디렉토리 목록을 출력

-exec commands : 대응대는 파일에 대해 commands 명령 수행

-ok commands : 파일에 대한 commands 명령 수행전에 입력 대기 상태

-xdev : 검색 시작 디렉토리가 속해 있는 파일 시스템에 대해서만 검색 제한

-mount : IRIX 와 SCO UNIX 에서 -xdev 옵션

-prune : 서브 디렉토리는 검색을 하지 않음

-print 옵션은 근래는 기본으로 들어간다. 굳이 붙일 필요는 없고, -exec, -ok

옵션 사용시에는 반드시 마지막에 \\; 으로 구문을 마감해야 한다.

예를 들어서 find 로 검색한 파일을 지우기 위해서는 다음과 같이 한다.

# find ./ -name *.* -exec rm -f {} \\;

이와 같이 find 명령어를 이용한 시스템 관리 방법 예를 몇가지 들어 보겠다.

1. 파일 크기가10M 이상이며 한달 이상동안 수정되지 않은 파일을 찾는다.

# find / -type f -size +20480 -mtime +30 -ls

# find / -type f -size +20480 -mtime +30 -exec rm -f {} \\;

(대응되는 파일삭제)

2. 보안에 관련된 팁이다. 모든 setuid, setgid 를 검색한다.

# find / -type f \\( -perm -4000 -o -perm -2000 \\)

# find / -type f \\( -perm -4000 -o -perm -2000 \\) | diff – setuidlist

(찾아된 setuid,setgid를 기존에 작성한 목록과 비교하여 새로 추가 된것이 있는지

를 확인한다. )

* 서진우님에 의해서 게시물 복사되었습니다 (2004-10-07 16:03)

서진우

슈퍼컴퓨팅 전문 기업 클루닉스/ 상무(기술이사)/ 정보시스템감리사/ 시스존 블로그 운영자

You may also like...

2 Responses

  1. 김무성 말해보세요:

    find /home/admin -user admin -ls | awk ‘{sum+=$7} END{print sum}’
    와 같이 awk로 연산기능을 할수 있다는 것을 처음 알았습니다. 그리고 grep의 경우에도 grep 검색할 패턴이 한개이상일 때 저는 지금까지 아래와 같이 사용하였습니다.

    “grep -v pattern1 | grep -v pattern2 ”

    하지만 이글을 보고 egrep를 이용하면 아래와 같이 편리하게 사용할 수 있을것 같다고 생각합니다.

    egrep -v ‘pattern1|pattern2’

    find 명령어 역시 보통 -name 옵션만 주로 사용하였는데 다른 옵션을 잘 활용하면 더욱 편리하게 시스템 관리를 할 수 있을 것이라고 생각합니다.

    앞으로 스크립트 작성시 효율적인 스크립트 작성을 할수 있도록 노력하겠습니다.

    좋은 정보알려 주셔서 감사합니다.

  2. 서진우 말해보세요:

    egrep 도 좋은 패턴 추적 툴이죠. 관련 내용의 팁도 아마 존재 할것입니다.
    계속 열심히 탐구해 주시길 바랍니다.

서진우 에 응답 남기기 응답 취소