메타문자 |
기 능 |
사용 예 |
사용 예 설명 |
^ |
행의 시작 지시자 |
'^love' |
love로 시작하는 모든 행과 대응 |
$ |
행의 끝 지시자 |
'love$' |
love로 끝나는 모든 행과 대응 |
. |
하나의 문자와 대응 |
'l..e' |
l 다음에 두 글자가 나오고 e로 끝나는 문자열을 포함하는 행과 대응 |
* |
선행문자와 같은 문자의 0개 혹은 임의개수와 대응 |
' *love' |
0개 혹은 임의 개수의 공백 문자 후에 love로 끝나는 문자열을 포함한 행과 대응 |
[] |
[] 사이의 문자 집합중 하나와 대응 |
'[Ll]ove' |
love나 Love를 포함하는 행과 대응 |
[^ ] |
문자집합에 속하지 않는 한 문자와 대응 |
'[^A-K]love' |
A와 K 사이의 범위에 포함되지 않는 한 문자와 ove가 붙어있는 문자열과 대응 |
\< |
단어의 시작 지시자 |
'\ |
love로 시작하는 단어를 포함하는 행과 대응(vi,grep에서 지원) |
\> |
단어의 끝 지시자 |
'love\>' |
love로 끝나는 단어를 포함하는 행과 대응
(vi,grep에서 지원) |
\(..\) |
다음 사용을 위해 태그를 붙인다. |
'\(lov\)ing' |
지정된 부분을 태크1에 저장한다. 나중에 태그값을 참고하려면 \1을 쓴다. 맨 왼쪽부터 시작해 태그를 9개가지 쓸 수 있다. 왼쪽 예에서는 lov가 레지스터1에 저장되고 나중에 \1로 참고할 수 있다. |
x\{m\} |
문자 x를 m번 반복한다. |
'o\{5\}' |
문자 o가 5회 연속적으로 나오는 모든 행과 대응 |
x\{m,\} |
적어도 m번 반복한다. |
'o\{5,\}' |
문자 o가 최소한 5회 반복되는 모든 행과 대응 |
x\{m,n\} |
m회 이상 n회 이하 반복한다. |
o\{5,10\}' |
문자 o가 5회에서 10회 사이의 횟수로 연속적으로 나타나는 문자열과 대응 |
grep의 옵션
옵션 |
동작 설명 |
-b |
검색 결과의 각 행 앞에 검색된 위치의 블록 번호를 표시한다. 검색 내용이 디스크의 어디쯤 있는지 위치를 알아내는데 유용하다. |
-c |
검색 결과를 출력하는 대신, 찾아낸 행의 총수를 출력한다. (count) |
-h |
파일 이름을 출력하지 않는다. |
-i |
대소문자를 구분 하지 않는다.(대문자와 소문자를 동일하게 취급). (ignore) |
-l |
패턴이 존재하는 파일의 이름만 출력한다.(개행문자로 구분) (list file) |
-n |
파일 내에서 행 번호를 함께 출력한다. (number) |
-s |
에러 메시지 외에는 출력하지 않는다. 종료상태를 검사할 때 유용하게 쓸 수 있다. |
-v |
패턴이 존재하지 않는 행만 출력한다. (invert) |
-w |
패턴 표현식을 하나의 단어로 취급하여 검색한다. (word) |
경변수인 LOGNAME의 값을 가진 모든 행을 출력한다. 변수가 큰따옴표로 둘러싸여 있는 경우, 쉘은 변수의 값으로 치환한다.
작은따옴표로 둘러싸여 있으면 변수 치환이 일어나지 않고 그냥 $LOGNAME 이라는 문자로 출력된다.)
메타문자 |
기능 |
사용 예 |
사용 예 설명 |
+ |
선행문자와 같은 문자의 1개 혹은 임의 개수와 대응 |
'[a-z]+ove' |
1개 이상의 소문자 뒤에 ove가 붙어있는 문자열과 대응. move,approve,love,behoove 등이 해당된다. |
? |
선행문자와 같은 문자의0개 혹은 1개와 대응 |
'lo?ve' |
l 다음에 0개의 문자 혹은 하나의 문자가 o가 나오는 문자열과 대응. love,lve 등이 해당된다. |
a|b |
a 혹은 b와 대응 |
'love|hate' |
love 혹은 hate와 대응. |
() |
정규표현식을 묶어준다 |
'love(able|ly)' |
lovable 혹은 lovely와 대응. |
'(ov)+' |
ov가 한 번 이상 등장하는 문자열과 일치. |
find 명령의 일반적인 형태는 다음과 같다.
각각의 인수들의 의미는 다음과 같다.
- path
- 찾기 시작할 위치를 나타낸다. 예를들어, `.'은 현재 디렉토리를 나타내고, `/'은 루트 디렉토리부터 찾을 겻을 나타낸다.
- expression
- 특정 파일을 찾기 위한 여려가지 조건들을 표현하는 부분으로 option, test, action, operator 등의 구문으로 구성되어진다.
그럼, expression의 각각의 구성 요소에 대하여 알아보자. option은 test와 상관 없이 항상 적용된다. option의 방법에는 다음과 같은 것이 있다.
-name : 확장자가 txt 인 화일을 찾는다.
find / -name '*.txt' |
-perm : 퍼미션이 666(-rw-rw-rw-)인 화일을 찾는다.
find . -perm 666 |
-type : 파일의 타입을 지정하여, 찾고자하는 파일을 찾는다.
타입의 종류는 다음과 같다. b : 블록 특수 파일(block device)
c : 캐릭터 특수 파일 (character deice)
d : 디렉토리(directory)
f : 일반파일(file)
l : 심볼릭 링크(link)
p : 파이프 (pipe)
s : 소켓 (socket)
현재 디렉토리 아래에 있는 서브디렉토리를 모두 찾는다.
find . -type d |
-atime +n/-n/n : 최근 n일 이전에 액세스된 파일을 찾아준다.(accessed time) +n은 n일 또는 그보다 더 오래 전의 파일
-n은 오늘 부터 n일 전까지의 파일
n은 정확히 n일 전에 액세스되었음을 의미한다.
시스템 전체에서 한 달 또는 그 이상의 기간동안 한번도 액세스하지 않은 디렉토리
find / -atime +30 -type d |
-ctime +n/-n/n : ctime은 파일의 퍼미션을 마지막으로 변경시킨 날짜를 의미한다. (changed time) +n은 n일 또는 그보다 더 오래 전의 파일
-n은 오늘 부터 n일 전까지의 파일
n은 정확히 n일 전에 수정되었음을 의미한다.
현재 디렉토리 아래에서 최근 일주일 동안 고친 파일
find . -ctime -7 |
-mtime +n/-n/n : mtime은 파일내의 data를 마지막으로 변경한 날짜를 의미한다.(modified time) +n은 n일 또는 그보다 더 오래 전의 파일
-n은 오늘 부터 n일 전까지의 파일
n은 정확히 n일 전에 수정되었음을 의미한다.
-cnewer 파일명 : '파일명' 부분에 적어준 파일보다 더 최근에 수정된 파일들을 찾아준다.
test.txt 화일이 생성된 이후의 화일을 찾는다.
find . -cnewer test.txt -print |
-user 유저네임 : '유저네임' 부분에 지정한 유저 소유의 파일을 찾아준다.
nalabi 라는 계정의 화일을 찾아준다.
find / -user nalabi |
-maxdepth n
0이 아닌 정수값으로 경로 깊이를 지정하여 검색을 할 경우에 사용한다. 예를들어, '-maxdepth 1'은 시작위치로 지정한 디렉토리만 검색하고 하위 디렉토리는 찾지 않는다.
-mindepth 옵션은 반대로 동작한다. 즉, 지정한 숫자만큼의 깊이부터 그 하위 디렉토리를 검색한다. (GNU find 버전) -follow
심볼릭 링크된 디렉토리도 검색을 할 경우에 사용한다.
-mount 현재의 파일 시스템과 동일한 타입의 파일 시스템에서만 검색을 할 경우에 사용한다.
test에는 다음과 같은 방법들이 있으며, test에 사용하는 인수에는 보다 큰 수를 의미하는 `'나, 보다 작은 수를 의미하는 `'를 함께 사용할 수 있다. 인수에 아무 연산자가 없을 경우에는 정확히 그 인수 값을 의미한다.
-group
특정 그룹 소유의 파일들을 찾을 경우에 사용한다.
-nouser
소유자가 없는 파일을 찾을 경우에 사용한다. 즉, /etc/passwd 파일에 없는 소유자의 파일을 찾을 경우에 사용한다.
-nogroup
올바른 그룹의 소유가 아닌 파일을 찾을 경우에 사용한다. 즉, /etc/groups 파일에 없는 그룹의 소유인 파일을 찾을 경우에 사용한다.
newer file1 file2
`file1' 보다는 이후에 `file2' 보다는 이전에 생성되거나 변형된 파일들을 찾을 경우에 사용한다.
-size n[bckw]
크기가 n 유닛(unit)인 파일을 찾을 경우에 사용한다. 유닛은 기본 설정(`b''와 함께 사용한 경우와 동일)인 512 바이트의 블럭, `c'를 사용할 경우에는 1 바이트, `k'를 사용할 경우에는 킬로바이트, `w'를 사용할 경우에는 2 바이트의 워드 크기를 나타낸다.
-empty
비어있는 파일이나 디렉토리를 찾을 경우에 사용한다. (GNU find 버전)
-regex
정규표현식(regular expression)을 이용하여 파일들을 찾을 경우에 사용한다. `-iregex'는 대소문자를 구별하지 않을 경우에 사용한다. (GNU find 버전)
action은 test에서의 조건과 일치하는 파일들에 대해 수행할 작업을 명시하는 것으로 다음과 같은 방법들이 있다.
-print
찾은 파일들을 표준출력(stdout)으로 출력한다. 기본으로 설정되어 있다.
-fprint file
찾은 파일들을 `file'로 출력한다. `file'이 존재 하지 않을 경우에는 새로 생성되고, 존재할 경우에는 기존의 파일은 없어진다. (GNU find 버전)
-exec
파일을 찾았을 경우, 찾은 파일들에 대해 특정 명령을 수행 할 때 사용한다. 일반적으로 `-exec command {} ;'의 형식을 취한다.
-ok
-exec와 동일한 작업을 한다. 다른 점은, 명령을 실행할 때마다 실행 의사를 물어본다.
-ls
`ls -dils' 형식으로 찾은 파일들의 정보를 출력할때 사용한다.
-fls file
`ls'와 동일하게 동작하며 결과를 `file'로 출력한다.
operator는 test에서 사용한 옵션들을 조합하여 조건식을 만들고자 할때 사용는 것으로 다음과 같은 방법들이 있다. (설명 순서는 우선순위(precedence)에 따른다.)
[예제]
자신의 홈 디렉토리에서 확장자가 '.txt'인 파일을 찾을 경우
$ find -name "*.txt'' -print
현재 디렉토리 밑에서 첫글자가 영어 대문자인 모든 파일을 찾을 경우 $ find . -name "[A-Z]*'' -print
'/usr/local'에서 첫 두글자는 영어 소문자이고 세번째 한자리는 숫자로 시작하는 이름을 가진 파일을 찾을 경우 $ find /usr/local -name "[a-z][a-z][0-9]*'' -print
확장자가 .txt 인 파일을 찾으면서 현재 디렉토리와 한 단계 밑의 디렉토리에서만 파일을 찾을 경우 $ find -maxdepth 2 -name "*.txt'' -print
현재 디렉토리 밑에서 `zzang'이라는 이름을 가진 사용자 소유의 파일을 찾을 경우 $ find . -user zzang -print
시스템에서 소유자나 그룹이 없는 파일을 찾을 경우 (크래커가 만들어 놓은 파일일 경우도 있음) $ find / -nouser -o -nogroup -print
자신의 홈 디렉토리에서 최근 3일 동안 변경된 파일들을 찾을 경우 $ find . -mtime -3 -print
'/tmp'에서 최근 5일 동안 변경되지 않은 파일들을 찾아서 삭제할 경우 (파일을 삭제할 때마다 삭제할 것인가를 물어보도록) $ find . -mtime +5 -print -ok rm {} ;
현재 디렉토리 밑에 있는 모든 포스트 스크립트 파일(.ps)을 찾아서 gzip으로 압축을 하고 그 목록을 result.txt라는 파일에 저정할 경우 $ find . -name "*.ps" -fprint result.txt -exec gzip {} ;
크랙커의 침입이 의심스러워 자신의 시스템에서 suid와 guid가 설정된 일반 파일들을 찾아서 권한을 확인할 경우 $ find / -type f -perm +6000 -print -ls
시스템 관리의 실수로 일반 사용자가 쓰기 권한을 갖도록 설정되어 있는 파일을 찾아서 실행 권한을 없애는 경우 (단, 링크 파일은 제외함) $ find / -perm +2 ! -type l -print -exec chmod o-w {} ;
7. 기타 활용
현재 디렉토리에서 가장 큰 파일을 찾기
$ find . -type f | xargs du -s | sort -n | tail -1
위 한 줄의 명령어는 현재 디렉토리에 서브 디렉토리 포함하여 가장 큰 파일을 하나 찾아서 이를 출력하라는 의미이다.
간혹, 파일 시스템의 FULL이 되어서 가장 큰 파일을 찾으려고 할 경우 아주 유용하다.
* 현재 디렉토리에서 확장자가 cpp 이고 string 이란 문자열이 포함된 파일 검색
$ find / -name "*.cpp" -print -exec grep string {} \
* 현재 디렉토리 위치에서 하위디렉토리를 포함하여 string 이란 문자열을 포함한 파일 검색
$ find . -type f | xargs grep "string"
이 방법은 파일 이름에 공백이 들어갈 경우 문제가 생길 수 있습니다.
공백이 포함된 화일은 아래와 같이 찾아보시면 될거에요
$ find . -type f -print0 | xargs -0 grep "string"
* 현재 디렉토리내에서 확장자가 cpp 이고 string 문자열을 포함하는 파일 검색
파일이름과 내용을 보여주려면.. $ grep string `find . -name \*\.cpp`
파일이름만 보여주려면..
$ grep -l string `find . -name \*\.cpp`
| (파이프, pipe, 수직바) 의 뜻은
"왼쪽 프로그램의 실행 결과를 오른쪽 프로그램의 입력으로 공급하라" 입니다.
파이프 왼쪽 오른쪽 프로그램이 동시에 실행된다는 것은 엄밀히 말하면 틀린얘기입니다.
왼쪽 프로그램이 실행되고 그 결과가 output 되면 오른쪽 프로그램의 input으로 공급되는 것입니다. 동시가 아닌 순차적인 개념입니다.
예를 들면,
"검색 프로그램의 출력을 정렬 프로그램으로 파이프시킬 수 있고 다시 그 결과를 프린팅 프로그램으로 파이프시키거나 파일로 리다이렉트해서 저장할 수도 있다."
grep 은 가장 유용한 툴 중의 하나입니다.
grep 의 주된 기능은 정규표현식에 매칭되는 문자열을 찾아서 해당 라인만을 출력하는 것입니다.
쉽게 말해, 출력결과(or 입력)에서 찾는 문자열이 있는 라인만 보여주는 기능을 합니다.
egrep은 grep의 확장판인데 두개이상의 문자열을 검색합니다.
# netatte -ap | egrep "aaa|bbb|ccc"
하면 netstate의 결과물중 aaa 혹은 bbb 혹은 ccc가 있는 라인을 출력하는거죠
즉 or 검색이 가능합니다.
grep 하위 디렉토리 까지 조회시 -r 옵션 안될경우
보통 리눅스에서는 grep -r 하위 디렉토리까지 파일을 검색 할수 있게 recursive 옵션을 지원하지만 전통? grep에는 -r 옵션이 없는지 AIX ,HP,Solaris 에서는 -r 옵션을 사용 할수 없다.
그렇다면 여기서 find 와 xargs 를 이용하여 -r 옵션과 같은 실행을 할수 있는 방법은 아래와 같다.
ex) dir : /home/search/cgi-src
1. -r 옵션 이용 : grep -r "include" /home/search/cgi-src
2. find 와 xargs 이용 : find /home/search/cgi-src | xargs grep "include"
뭐 여기서 xargs는 간단하게 말해 파이프 '|' 를 통해 입력 받아서 xargs 뒤에 있는 명령어(grep)한테 파라미터를 주는것.
* xargs 활용 (여러파일 동시에 백업하기)
예를들어 test.cpp
test1.cpp
test2.cpp
이런식으로 다수의 파일이 있을떄 일일히 cp 명령어로 .bak 파일을 만드려면 번거로울 것이다.
한번에 처리할 수 있는 방법이 있다.
$ ls test* | xargs -t -i cp {} {}.bak
한번에 확장자 여러개를 찾기
find ./ -type f \( -name "*.php" -or -name "*.php3" -or -name "*.inc" -or -name "*.css" -or -name "*.js" -or -name "*.html" \)
출처 : http://pelican7.egloos.com/1471855
'unix' 카테고리의 다른 글
regular expressions - 여러파일 확장자 바꾸기 (0) | 2013.08.13 |
---|---|
리눅스 여러파일 수정하기 (find) (0) | 2013.08.13 |
crontab 사용법 및 log (0) | 2013.06.25 |
FTP SITE Commands (site 명령어) (0) | 2013.03.28 |
rfc949 분석(ftp) - 명령어 분석 (0) | 2013.03.28 |