2008. 7. 22. 13:28

Chapter 5. Unix Basic Commands _ 파일/디렉토리 검색 관련 명령어

검색에 관련한 명령어

grep 명령어

find 명령어



grep CMD

__________________

search a file for a pattern

globally/regular/expression

The grep utility searches text files for a pattern and

prints all lines that contain that pattern. It uses a com-

pact non-deterministic algorithm.

Be careful using the characters $, *, [, ^, |, (, ), and \

in the pattern_list because they are also meaningful to the

shell. It is safest to enclose the entire pattern_list in

single quotes '...'.

If no files are specified, grep assumes standard input. Nor-

mally, each line found is copied to standard output. The

file name is printed before each line found if there is more

than one input file.


(
명령어 형식)

grep OPTION(s) PATTERN filename


(
기본 사용법)

# grep root /etc/passwd


[
참고] 실무 사용예

# CMD | grep inetd

# cat /etc/passwd | grep root (# grep root /etc/passwd)

# ps -ef | grep inetd

# pkginfo | grep Apache

# patchadd -p | grep 115158-10


# cat /var/adm/messages | grep 'Jan'

# cat /var/adm/messages | grep 'Jan 15'

# cat /var/adm/messages | grep 'Jan 15 14:'

# cat /var/adm/messages | grep 'Jan 15 14:26:'

# cat /var/adm/messages | grep warn

# cat /var/adm/messages | grep inetd


(
옵션 사용법)

# grep -c root /etc/passwd (-c : count) // -c : 개수

# grep -n root /etc/passwd (-n : number line) // -l : 찾은 라인 넘버

# grep -l root /etc/hosts /etc/passwd /etc/group (-l : list files) // - : 찾은 파일 list

# grep -v root /etc/passwd (-v : inVerse, except) // -v : 제외

# grep -i root /etc/passwd (-i : ignore case, 대문자/소문자) // -I : 대소문자 구분 없이


[
참고] -c, -n 옵션

쉘 스크립트에서 많이 활용하고 있다.


[
참고] grep -v 명령어 실습

# prtconf

# prtconf | grep -v not

Not attached devide


[
참고] grep -l 명령어 실습

부팅과정(Boot Sequence)

Server PowerON => POST => Boot Program => Kernel => init process

......

Server Error

......

# grep -l "Server Error" /etc/rc?.d/* // Sever Error 메시지를 나타낸 파일 리스트를 보여줌

/etc/rcS.d/S30network.sh

# vi S30network.sh

....

/Server Error

....

if [ Condition ] ; then

Statement(Action)

else

echo "Server Error"

fi



(
패턴 사용법)

정규화된 표현식(Regular Expression)

. no...y //임의의 문자 1개 대용

[ab] [Rr]oot // [Rr] oot고정 R or r 매치

[a-c] [a-c]bc // [a-c] bc고정 a,b,c 에서 매치

[^a] [^a]bc // [^a] bc고정 첫글자 a를 제외한 한 개 글자 ?????????????

? /etc/rc?.d/ // ? 한 개의 모든 문자

* file* // file 뒤에 모든 것 1나 이상의

^root ^root // 라인의 처음이 root로 시작

root$ root$ // 라인의 끝이 root



# grep 'PATTERN(s)' filename

# grep 'no...y' /etc/passwd

# grep '[Rr]oot' /etc/passwd

# grep 'r*t' /etc/passwd

# grep '^root' /etc/passwd

# grep 'root$' /etc/group

[참고] egrep / fgrep

- egrep 명령어(Extended grep)

- fgrep 명령어(Fixed grep)

# egrep '(Network|uucp) Admin' /etc/passwd

# fgrep '*' /etc/system




find CMD

__________________

find files

The find utility recursively descends the directory hierar-

chy for each path seeking files that match a Boolean expres-

sion written in the primaries given below.

find will be able to descend to arbitrary depths in a file

hierarchy and will not fail due to path length limitations

(unless a path operand specified by the application exceeds

PATH_MAX requirements).



(1). find / -name core -type f

                                d

(2). find / -user user01 -group    staff -type f

(3). find / -atime -7  -type f (atime : access time)

             -mtime  7          (mtime : modify time)

                    +7

(4). find / -perm -4000    -o -perm -2000 -type f

            -perm  755

                   -755

(5). find / -size  3000c -type f

                    +3000c

                    -3000c

(6). find / -name core -type f -exec rm {} \;


(EX) find CMD
실습


(
실습 준비)

# cd /test

# rm -r *

# touch file1 file2

# mkdir dir1 dir2

# touch dir1/file1

# touch dir2/file3

 

/ - test -+- dir1 - file1

          +- dir2 - file3

          +- file1

          +- file2


[
그림] 실습 환경


(
첫번째 형식) find / -name core -type f

# cd /test

# find . -name file1 -type f

./dir1/file1

./file1


[
참고] # find . -name "*.log" -type f


(
두번째 형식) find / -user user01 -group staff

# ls -l file1 (file1: root other)

# chown user01 file1

# ls -l file1 (file1: user01 other)

# find . -user user01 -type f

./file1


(
세번째 형식) find / -mtime 7 -type f

# cd dir2

# touch file1 file2 file3 file4 file5 file6

# date

현재 시간: 126 1111 (23 1750)

# touch -t 12051111 file2

# touch -t 12041111 file3

# touch -t 12031111 file4

# touch -t 12021111 file5

# touch -t 12011111 file6


파일은 미래에 만들었다는 것은 없다

아래와같이 된다.

                                               mtime +3

                                               +----+

                                                                       mtime -3

                                                        20 21 22+----+----+

                                                          19 mtime 3

                                            ----+----+----+----+----+----+----+----+----+----+

                                                17   18   19   20   21   22

                                                                            now


# ls -l file*

# find . -mtime 3 -type f

./file4

# find . -mtime -3 -type f

./file3

./file1

./file2

# find . -mtime +3 -type f

./file5

./file6


(4번째 형식) find / -perm -4000 -o -perm -2000 -type f

-perm 644  (rw-r--r--)

-perm -644 (rw-r--r--)

      -6XX  rw-

            rwx

      -4XX  r--

            r-x

            rw-

            rwx

-perm -4000 (최소한 SetUID bit 인것)


# find /test -perm 644 -type f

# find /test -perm -644 (rw-r--r--)

(rwxr-xr-x)


# cd /test

# mkdir dir3

# cd dir3

# touch file1 file2 file3 file4 file5 file6 file7 file8

# chmod 000 file1 (---)

# chmod 100 file2 (--x)

# chmod 200 file3 (-w-)

# chmod 300 file4 (-wx)

# chmod 400 file5 (r--)

# chmod 500 file6 (r-x)

# chmod 600 file7 (rw-)

# chmod 700 file8 (rwx)


# find . -perm 600 -type f -ls (rw-) //
600

# find . -perm -400 -type f -ls (r--) // 400 이상


(
다섯번째 형식) find / -size 500c -type f

# cd /test/dir2

# cp /etc/passwd file10

# ls -l file10 (size : 560 bytes)

# cp /etc/inet/inetd.conf file11

# ls -l file11 (size : 6961 bytes)


# find . -size 560c -type f // size
가 딱 560c

# find . -size +560c -type f // size 560c 초과

# find . -size -560c -type f // size 560c 미만


(
여섯번째 형식) find / -name core -type f -exec rm {} \;

# cd /test

# find . -name file1 -type f

# find . -name file1 -type f -exec rm {} \;

# ls -R



[
참고] find 명령어 활용예


■ 로그 파일 정책(Log Policy)

- 로그 디렉토리 안에 로그 파일이 최근 30일 로그 기록만 남기도록 한다.

# crontab -e

Mi Ho Da Mo We CMD

0 5 1 * * find /Log_Dir -name "*.log" -type f -mtime +30 -exec rm {} \;

분 시 일 월 주


find 명령어의 다른 옵션들

# find / -nouser -type f

# find / -nogroup -type f

# find / \( -type f -o -type d \) -perm -0002 -ls

# find / -perm -o=w -type f -print


find 명령어를 통한 퍼미션 변경

/test/dir01 -+- file1

             +- file2

             +- dir02 - file3

             +- dir03


file* => 640(rw-r-----)


# find /test/dir01 -type f -exec chmod 640 {} \;

# find /test/dir01 -type f -name "*.log" -exec chmod 640 {} \;


[EX] find
명령어를 활용한 퍼미션 변경

# find /test/dir01 -type f -ls

# find /test/dir01 -type f -exec chmod 640 {} \;

# find /test/dir01 -type f -ls


[
참고] 로그 파일이 너무 많다면 !!!!!

- Log_Dir/* (100만개 이상의 로그파일)


# cd /Log_Dir

# rm *

로그 파일을 지울수 없거나 혹은 지우것을 확인하기 어렵다.

# cd ..

# ls

Log_Dir

# rm -r Log_Dir

# ps

# rm -r Log_Dir &

# while [ 1 ]

> do

> ps | grep rm | grep -v grep

> sleep 2

> done


[
참고] 서버 해킹을 당한 경우의 간단한 처리


(1).
로그 백업

# cp -r /var /backup/var.20060816

# cd /var/adm/"logfile"


(2).
히스토리 확인

# history > /backup/history.20060816

# cat ~/.sh_history



(3).
프로세스 확인

# ps -ef | more


(4). find
명령어 활용

# find / -mtime -7 -type f 2>/dev/null

# find / -nouser -type f

# find / -perm -2 -type f


출처 : http://cafe.daum.net/bscsolaris