[강좌][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)
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 옵션만 주로 사용하였는데 다른 옵션을 잘 활용하면 더욱 편리하게 시스템 관리를 할 수 있을 것이라고 생각합니다.
앞으로 스크립트 작성시 효율적인 스크립트 작성을 할수 있도록 노력하겠습니다.
좋은 정보알려 주셔서 감사합니다.
egrep 도 좋은 패턴 추적 툴이죠. 관련 내용의 팁도 아마 존재 할것입니다.
계속 열심히 탐구해 주시길 바랍니다.