Server & OS

find, grep(egrep, fgrep)

컨텐츠 정보

본문

1. grep 명령어
grep : 파일 전체를 검색해서 정규 표현식에 대응하는 모든 행들을 출력한다.
egrep : extended grep, grep의 확장판으로 추가 정규 표현식, 메타 문자를 지원한다.
fgrep : fixed character gerp, fast grep, 모든 문자를 문자 그대로 취급한다. 즉, 정규 표현식의 메타 문자도 일반 문자로 취급한다.

사용법
grep [옵션]... 패턴 [파일] ...
Search for PATTERN in each FILE or standard input.
Example: grep -i 'hello world' menu.h main.c

grep에서 사용하는 정규 표현식 메타 문자
메타 문자 / 기능 / 사용 예 / 사용 예 설명
^ / 행의 시작 시시자 / '^love' / love로 시작하는 모든 행과 대응
$ / 행의 끝 지시자 / 'love$' / love로 끝나는 모든 행과 대응
. / 하나의 문자와 대응 / 'l..e' / l 다음에 두 글자가 나오고 e로 끝나는 문자열을 포함하는 행과 대응
[] / [] 사이의 문자 집합 중 하나와 대응 / '[Ll]ove' / Love나 love를 포함하는 행과 대응
[^] / 문자 집합에 속하지 않는 한 문자와 대응 / '[^A-K]ove / A와 K 사이의 범위에 포함되지 않는 한 문자와 ove가 붙어있는 문자열과 대응

grep 옵션
-c : 일치하는 행의 총 수를 출력한다(count).
-h : 파일 이름을 출력하지 않는다.
-i : 대소문자를 구분하지 않는다(ignore).
-l : 패턴이 존재하는 파일의 이름만 출력한다(list file).
-n : 파일 내에 행 번호를 함께 출력한다(number).
-v : 패턴이 존재하지 않는 행만 출력한다(invert).
- w : 단어 단위로 찾는다(word).


2. find 명령어
find [path...] [expression]
유닉스 마다 조금씩 다른 문법을 가지고 있기 때문에 시스템의 find 맨 페이지를 살펴봐야 한다.

-name : 이름으로 파일을 찾는다(와일드 카드와 함께 사용될 때에는 반드시 따옴표로 묶어야 함).
-type [bdcplfs] : 파일의 종류(블록, 디렉토리, 문자, 파이프, 심볼릭 링크, 일반 파일, 소켓)를 지정하여 찾는다.
-user : 소유자로 파일을 찾는다(이름이나 UID).
-group : 그룹으로 파일을 찾는다(이름이나 GID).
-perm : 퍼미션으로 파일을 찾는다(권한 지정).
-size : 
-atime n : 파일이 읽힌 가장 최근 시간으로 찾는다(accessed time).
-ctime n : 파일의 소유자 권한이 바뀐 가장 최근 시간으로 찾는다(changed time)
-mtime +n/-n/n : 파일이 수정된 가장 날짜로 찾는다(modified time)
    +5 - 5일 동안 수정 되지 않은 파일
    -5 - 5일 동안에 수정된 파일
      5 - 오늘부터 5일 전에 수정된 파일
-newer file1 file2 : file1 보다는 새로운 파일이지만 file2 보다는 오래된 파일을 찾는다.
-delete : 찾은 파일을 삭제한다.
-ls : ls -dils와 같은 출력을 한다.
-print : find 명령의 실행 결과를 출력한다.
-exec command {} \\; : 파일을 찾은 후 찾은 파일들에 대해 특정 명령을 수행한다(문법 주의).
-depth :
-maxdepth n : 0이 아닌 정수 값으로 경로 깊이를 지정하여 찾는다(1은 시작 위치로 지정한 디렉토리만 검색).
-follow : 심볼릭 링크가 있으면 심볼릭 링크를 따라가서 찾는다.
-mount : 현재 파일 시스템과 동일한 파일 시스템에서만 찾는다.
-nouser : /etc/passwd 파일에 없는 소유자의 파일을 찾는다.
-nogroup : /etc/groups 파일에 없는 그룹의 파일을 찾는다.

사용 예시
# find . -print
.은 현재 디렉토리를 의미한다. 현재 find 명령어가 실행되고 있는 디렉토리와 그 모든 서브 디렉토리에 있는 파일들을 찾아서 화면에 출력한다.

# find . -name "*.pdf" -print
# find . -name '*.pdf' -print
# find . -name \\*.pdf -print

- .pdf인 모든 파일을 모두 찾는다.
./pdfs/gdb(1).pdf
./pdfs/gdb(2).pdf
./pdfs/gdb(3).pdf
./docs/Firewall.pdf

# find . -name "*.pdf" -print | grep -v "^\\./pdfs/"
- pdfs 디렉토리 내에 있지 않은 pdf 파일 만을 찾는다.
find 명령의 결과를 파이프를 통해 grep에 전달한다.
grep에서 -v는 역 필터를 설정한다. 즉, grep -v 다음에 나오는 것과 반대되는 것을 보여준다.
전체 표현 식을 인용 부호 감싸 주었다("^./pdfs/").
    ^는 grep에게 표현 식이 각 라인의 1열에서부터 일치하는 것 만을 찾으라 말하는 것이다.
    \\는 .을 특별한 문자로 해석하지 못하게 하기 위해 쓰인 추가적인 인용 부호이다.
표현 식 전체는 grep에게 ./pdfs/ 디렉토리에 있지 않는 .pdf 파일을 찾아 보여달라는 것을 의미한다.

# find . -name "*.pdf" -print | grep -v "^\\./pdfs/" | xargs -J X mv X ./pdfs/
- 찾은 파일을 다른 디렉토리로 옮긴다.
grep은 find의 결과를 필터링 한다. 그 grep의 결과 값이 pipe를 통해 xargs 명령어로 전달이 되고 원하는 일이 완료된다.
J 스위치는 xargs 명령어에게 stdin으로 들어오는 모든 파일들을 소스로, 명령어 다음에 나오는 파일을 목적지로 가정하게 한다. 예를 들면 find 명령을 내리기 전에는 얼마나 많은 파일들을 옮겨야 하는 지 알 수 없다. 찾은 파일이 몇 개인지 상관없이 xargs가 해당 파일 모두를 pdfs 디렉토리로 옮기게 하는 일종의 마법 같은 작업이 J 스위치로 인해 가능하다. 또한 J 스위치가 올바르게 작동시키기 위해 X라는 문자열을 정의하여 mv 다음에 삽입한다.

# find . -atime +30 -print
- 파일을 읽은 30일 이상이 지난 파일들을 찾아서 보여준다.

# find . -mtime -1 -print
- 24 시간 안에 수정된 파일을 찾아서 보여준다.

# find . -atime +7 -o -size +20480 -print
- 7일 이상 접근하지 않은 파일이거나 크기가 10MB 이상인 파일을 찾아서 보여준다.
여러 스위치를 결합해서 사용할 때 -o나 논리 or를 사용하지 않는다면 모든 결과는 논리적인 and의 결과이다.
size 스위치는 크기를 512 바이트 단위로 인식한다.

# find . -atime +7 -o -size +`expr 10 \\* 1024 \\* 2` -print
- size를 KB 단위로 보여준다.
backquotes(`) 사이에서 필요로 하는 계산을 한다(`는 키보드의 가장 왼쪽 상단에 있다).

# echo find . -atime + 7 -o -size +`expr 10 \\* 1024 \\* 2` -print
find. -atime +7 -o -size +20480 -print
- find 명령어 앞에 echo를 더해서 그 결과가 무엇인지 미리 알아 볼 수도 있다.
--------------------------------------------------------------------------------

루트 디렉토리부터 대소문자 구별해서 파일 찾기
# find / -name 파일명 -type f

루트 디렉토리부터 대소문자 구별 없이 파일 찾기 (대소문자 구별 없음)
# find / -iname 파일명 -type f

루트 디렉토리부터 확장자가 txt인 파일 찾기
# find / -name "*.txt"

현재 디렉토리와 한 단계 아래의 디렉토리에서만 파일 찾기
# find . -maxdepth 2 -name "*.txt"

현재 디렉토리부터 첫 글자가 영어 대문자인 파일 찾기
# find . -name "[A-Z]*"

현재 디렉토리부터 worldtop이라는 사용자 소유의 파일 찾기
# find . -user worldtop

자신의 홈 디렉토리부터 최근 3일 동안 변경된 파일 찾기
# find ~ -mtime -3

루트 디렉토리부터 suid와 guid가 설정된 파일을 찾아서 권한 확인(cracker의 침입이 의심스러운 경우)
# find / -perm +6000
# find / -type f -perm +6000 -ls

현재 디렉토리부터 하위 디렉토리 내의 파일/폴더 명에 .jsp가 들어가는 경로를 포함한 파일/폴더 보여 주기
# find . | grep .jsp
# ls -R | grep .jsp ==> 경로 미 포함 파일/폴더 보여주기

파일들을 찾아서 recursive하게 삭제하기
# fine / -name *.log -exec rm {} \\;
-exec  파일을 찾은 후 다음의 명령을 실행하라.
rm {} \\;  한 세트로 앞에서 찾은 파일을 삭제하라. 띄어스기 주의!

관련자료

댓글 0
등록된 댓글이 없습니다.
Today's proverb
지금이 바로 새 출발점. 인생이란 하루하루가 훈련이다. 우리 자신을 훈련하는 터전이다. 실패도 할 수 있는 훈련장이다. 살아있음이 흥겨운 훈련장이다. 지금 이 행복을 기뻐하지 않고 언제 어디서 행복해지랴. 이 기쁨을 발판삼아 온 힘으로 나아가자. 나의 미래는 지금 이 순간 이 곳에 있다. 지금 여기서 노력하지 않고, 언제 어디서 노력하랴. (오히라 미쓰요의 <그러니까 당신도 살아> 중에서)