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 {} \\;  한 세트로 앞에서 찾은 파일을 삭제하라. 띄어스기 주의!

관련자료

등록된 댓글이 없습니다.
Today's proverb
우리는 유리할 때는 형제가 되고, 불리할 때는 남이 되며, 이로울 때는 친구가 되고, 해로울 때는 원수가 되는 그러한 인간관계를 증오한다. (북녘 하늘의 명언)