grep, egrep, fgrep
1. 기능
파일에서 특정한 패턴(문자열)을 찾는 명령어이다. 이는 해당 문자열이 들어있는 파일을 찾아 그 문자열이 들어가 있는 라인(행)을 화면에 출력한다.
아래에 언급하는 메타문자를 활용하여 더욱 강력한 기능으로써 그 역할을 수행해낸다
2. 사용법 (1)grep [옵션] [정규표현식(문자열)] [찾기 대상이 될 파일명]-입력으로 파일명이 오지 않으면 표준입력으로부터 입력을 받는다
(2)grep 패턴 *-현재 디렉토리에서 해당 문자열이 들어있는 파일을 찾아서 그 문자열이 들어가 있는 라인(행)을 화면에 출력한다.(서브디렉토리까지 검색하기 위해서는 아래 옵션에 언급하는 바와 같이 -r옵션을 주어야 한다)
-
grep 패턴 a* : a로 시작하는 모든 파일에서 해당 문자열이 들어있는 라인을 출력한다.
-이와 같이 간단하게 이용할 수도 있다.
3. 옵션-옵션은
대소문자를 구분한다.
-c, --count : 파일의 내용 대신 문자열이 들어있는 라인의 수를 출력(3개의 라인에서 매칭된다면 3출력)
-n, --line-number : 문자열이 들어있는 라인과 문두에 라인번호를 출력
-i, --ignore-case : 문자열의 대소문자 구분하지 않음
-l(소문자 L), --files-with-matches : 문자열 을 포함하는 파일의 이름만 출력
-r, --recursive : 서브 디렉토리의 파일까지 모두 출력
-v, --invert-match : 문자열이 제외된, 즉 문자열이 포함되어 있지 않은 라인을 출력
-e PATTERN, --regexp=PATTERN : pattern 에서 찾을 문자열 명시, 패턴으로 PATTERN을 사용("-으로 시작하는 패턴"을 보호하는데 유용)
-w, --word-regexp : pattern 이 전체 단어와 일치하는 줄만 출력, 단어의 일부로써 일치하는 경우가 아닌, 하나의 단어로써 일치하는 줄이 출력.
-x, --line-regexp : pattern 이 전체 줄과 일치하는 줄만 출력
-a, --text : 기본적으로 grep는 바이너리 파일을 처리할 수없다. 그런데 바이너리파일을 텍스트파일처럼 처리할 수있는 옵션이 -a 옵션이다
-A NUM, --after-context=NUM : 패턴매칭라인 이후의 라인을 NUM수만큼 출력
-B NUM, --before-context=NUM : 패턴매칭라인 이전의 내용을 NUM수만큼 출력.
-C NUM, -NUM, --context=NUM : 출력물 앞뒤 전후의 주어진 라인만큼 출력(패턴매칭 라인은 포함하지 않고 기본 2라인)
-b, --byte-offset : 패턴매칭되기전 라인의 바이트수를 출력
--binary-files=TYPE :
파일 헤더가 바이너리를 포함한 파일을 가리키면 TYPE형 파일이라고 인식한다.
기본은 binary이다.
grep는 일반적으로 바이너리 파일을 알 수있는 하나의 메시지를 출력하거나 매치되지 않으면 메세지를 출력하지 않는다.
TYPE이 without-match 이면 grep는 바이너리파일이 매치되지 않는걸로 생각한다.
이는 -I(대문자 I) 옵션과 동등하다.
만약 TYPE이 text이면 grep은 텍스트파일로써 바이너리를 처리한다.
이는 -a 옵션과 동등하다.
-d ACTION, --directories=ACTION :
입력파일이 디렉토리이면 ACTION 처리한다.
기본적으로 ACTION은 read이고, 이는 원본파일인것처럼 디렉토리가 읽는다는것을 의미한다. ACTION이 skip이면 skip된다. ACTION이 recurse이면 grep은 각각의 디렉토리이하를 순환적으로 읽어들인다.
이는 -r 옵션과 동등하다.
(이하 옵션 다음 신지식 참고 : grep 사용법)
-E, --extended-regexp : 확장 정규표현식으로 패턴을 해석한다(=egrep 같은 의미)
-F, --fixed-strings : newline으로 분리된 고정된 문자열의 리스트로써 패턴을 해석한다(=fgrep과 같은 의미)
-f FILE, --file=FILE : 파일로부터 패턴을 얻는다(파일의 라인마다). 공백파일은 zero 패턴을 포함한다. 그러므로 매치되는것이 없다.
-G, --basic-regexp : 정규표현식으로써 PATTERN을 해석하고 이것이 기본이다
-H, --with-filename : 매칭되는 파일명을 출력
-h, --no-filename :여러개의 파일이 검색되었을때 -H 옵션처럼 앞에 파일명을 출력하지 않는다
--help : help 메세지를 출력
-I(대문자 i) : 매칭된 데이터를 포함하지 않는것처럼 바이너리 파일을 처리한다. binary-files=without-match 옵션과 동등하다
-i, --ignore-case : 주어진 패턴이나 입력파일에서 대소문자를 무시한다.
-L, --files-without-match : 일반적으로 출력되는 출력을 스킵하고 각각의 입력파일을 출력한다. 처음으로 매칭되는 파일이 나타나면 중지된다
-l, --files-with-matches : -L 과 반대
--mmap :
가능하면 read 시스템콜대신 입력을 읽어들이는 mmap 시스템콜을 사용한다.
이 경우, 보다나은 퍼포먼스를 유지하지만 또한, grep 작동중 입력파일이 줄어든다거나 I/O 에러가 발생하면 비정상적인 동작을 야기시키기도 한다
-q, --quiet, --silent : 출력을 억제한다. 처음으로 매칭되는것이 발견되면 중지한다. -s, --no-messages 옵션 참조
-r, --recursive : 하위 디렉토리를 순환적으로 모두 읽는다. -d recurse 옵션과 동등하다
-s, --no-messages :
존재하지 않거나 읽기불가능한 파일에대한 에러메세지을 출력하지 않는다.
GNU grep과는 다르게 정통 grep은 POSIX.2 규격에 부합하지 않는다. 때문에 정통 grep은 -q 옵션이나 GNU -q 옵션같은 -s 옵션의 역할이 미미하다.
쉘스크립트에선 이식성을 위해 정통 grep에서 -q, -s 옵션을 억제하거나 /dev/null로 리다이렉트 시킨다
-U, --binary :
바이너리 파일로 취급한다.
MS-DOS나 MS-Windows에서는 grep은 기본적으로 파일의 첫 32KB의 내용을 보고 파일타입을 예측한다.
만약 grep이 텍스트파일로 인식하면 (정확한 정규표현 작업을 위해서) 원본파일로부터 CR 문자를 없앤다.
-U 옵션에 쓰이는건 모든 파일이 읽혀지고 매칭절차를 지나쳐야 하기때문이다.
각 라인의 끝에 CR/LF 가 포함된 텍스트파일이라면 정규표현식 처리에 원하지 않는 결과가 발생할 것이다. 이 옵션은 MS-DOS, MS-Windows와 다른 플랫폼에서는 작동하지 않는다.
-u, --unix-byte-offsets :
유닉스 스타일의 바이트출력한다.
이런 변환이 있기때문에 grep이 유닉스 스타일의 텍스트파일처럼 읽기가 가능해진다.
이것은 유닉스머신에서의 grep처럼 정확한 결과를 산출할 것이다.
이 옵션은 -b 옵션이 쓰이지 않으면 소용이 없다.
MS-DOS, MS-Windows와 다른 플랫폼에서는 작동하지 않는다.
-V, --version : 표준에러로 grep의 버전을 출력한다.
-w, --word-regexp :
문자열이 하나의 단어인 경우에만 검색, 즉 전체 단어유형 매칭을 포함하는 라인만 선택한다.
이 테스트는 매칭되는 문자열이 라인의 처음에 위치하거나 non-word에 의해 선두에 와야한다. 마찬가지로, 문미에 오거나 non-word가 마지막에 와야 한다.
word-constituent 는 문자,숫자,밑줄이 될 수있다.
-Z, --null :
파일명 대신 0 byte 문자를 출력한다.
예를들면, grep -IZ 는 유용한 newline 문자대신 각 파일명뒤에 0byte를 출력한다.
이 옵션은 newline과 같은 유용한 캐릭터를 포함하는 파일명까지도 출력을 명쾌하게 해준다. 이 옵션은 임의의 파일명을 처리하는 find -print0, perl -0, sort -z, xargs -0과 같은 명령어와 함께 사용될 수있고 newline 캐릭터를 포함하는 그 자체로도 사용할 수있다.
3. grep에서 사용하는 정규표현식 메타문자
메타문자 |
기 능 |
사용 예 |
사용 예 설명 |
^ |
행의 시작 지시자 |
'^love' |
love로 시작하는 모든 행과 대응 |
$ |
행의 끝 지시자 |
'love$' |
love로 끝나는 모든 행과 대응 |
. |
하나의 문자와 대응 |
'l..e' |
l 다음에 두 글자가 나오고 e로 끝나는 문자열을 포함하는 행과 대응 |
* |
선행문자와 같은 문자의 0개 혹은 임의개수와 대응 |
' *love' |
0개 혹은 임의 개수의 공백 문자 후에 love로 끝나는 문자열을 포함한 행과 대응(*앞에 공백이 있는 상태, 다른 문자가 있다면 그 문자가 0개 혹은 임의 개수의 문자 후에 love로 끝나느 경우를 말함)
|
[] |
[] 사이의 문자 집합중 하나와 대응 |
'[Ll]ove' |
love나 Love를 포함하는 행과 대응 |
[^ ] |
문자집합에 속하지 않는 한 문자와 대응 |
'[^A-K]love' |
A와 K 사이의 범위에 포함되지 않는 한 문자와 ove가 붙어있는 문자열과 대응 |
\< |
단어의 시작 지시자 |
'\<love' |
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회 사이의 횟수로 연속적으로 나타나는 문자열과 대응 |
(표참조 : http://www.leopit.com/Leophp/board/lecture_board/view.php?id=61&board_mode=linux)
4. egrepegrep은 grep의 확장판으로서 grep가 하나의 문자열을 찾는 것 과는 달리,
여러개의 문자열을 동시에 찾을 수 있고, grep에서 활용할 수 있는 메타문자 이외에
추가 정규표현식 메타문자를 지원한다.
(1)egrep에서 사용하는 정규표현식 메타문자+ : + 앞의 정규표현식이 1회 이상 나타남
? : ? 앞의 정규표현식이 0 또는 1회 나타남
| : 문자열간의 OR연산자
() : 정규 표현식을 둘러 쌈
(2)egrep 예제 egrep 'NW
|EA' datafile : (NW나 EA가 포함된 행을 출력한다. NW와 EA사이에 파이프( | ))
egrep '3
+' datafile : (숫자 3이 한 번 이상 등장하는 행을 출력한다.)
egrep '2.
?[0-9]' datafile : (숫자 2 다음에 마침표가 없거나 한 번 나오고, 다시 숫자가 오는 행을 출력한다.)
egrep '
(no
)+' datafile : (패턴 no가 한 번 이상 연속해서 나오는 행을 출력한다.)
egrep 'S
(h
|u
)' datafile : (문자 S 다음에 h나 u가 나오는 행을 출력한다.)
egrep 'Sh
|u' datafile : (패턴 Sh나 u를 포함한 행을 출력한다.)
5. fgrepfgrep는
문자열로만 검색을 한다. 문자열 부분에 위치한 모든 문자를 "
문자로써"취급한다. 즉, 정규표현식의 메타문자도 일반문자로 취급한다. fgrep은 문자열로만 검색하기 때문에
검색속도가 빠르다는 장점이 있다.
6. 참고 (1)정규 표현식에서 메타문자(& ! . * ? $ 및 \) 앞에 백슬래시(\)를 나타내면 grep으로 하여금 그것의 특수 의미를 무시하도록 한다.
ex) grep ^
\. // 마침표로 시작되는 줄을 찾음
grep '
\$' // "$" 문자가 포함된 줄을 찾음
(2)패턴을 작성할 때
\(역슬래쉬)가 들어가는 경우(\<, \(..\), x\{m\} 이러한 표현식 등)나,
특수문자를 문자자체로 인식하게 하려 \을 사용하는 경우, 패턴에 있어서
파이프( | )를 이용하는 경우에는 패턴을
따옴표(")나
작은 따옴표(')로 감싸주어야 한다.