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
현재 시간: 12월6일 11시11분 (2월3일 17시50일)
# 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