grep 명령어는 파일의 텍스트 패턴을 찾을 때 사용하는 강력한 프로그램입니다. ( 너무 강력해서 좀 무섭다.... )
grep은 파일 내에서 "패턴"을 만났을 때, 그 패턴을 가지고 있는 라인을 출력 합니다. grep은 다른 명령어랑 혼합해서 쓰는 것이 가능하며, 정규 표현식 이라고 하는 고급수준의 패턴을 사용하여 더 정밀한 검색 또한 가능합니다.
기본적으로 grep 명령어 혼자일 때 보다는 혼합해서 사용했을 때 더욱 효과를 발휘 합니다.
사용법은 다음과 같습니다.
grep [옵션] [패턴] [파일 또는 디렉토리]
옵션 종류
-A num : 일치하는 줄 다음에 지정한 줄 수(num)만큼의 내용을 더 보여준다.
-b : 일치하는 줄을 출력하는 내용의 맨 앞에 바이트 오프셋(byte offset)을 보여준다. ( 패턴 매칭되기전 라인의 바이트수를 출력 )
-B num : 일치하는 줄의 위에 지정한 줄 수만큼의 내용을 더 보여준다.
-c : 일치하는 줄의 수를 보여준다.
-C : 일치하는 줄의 위와 아래에 지정한 줄 수만큼의 내용을 더 보여준다.
-d [action] : 읽고자 하는 파일이 디렉터리 일 경우 지정한 값을 실행한다. 기본값으로는 read이다. 아래는 실행 가능한 값이다.
read : 디렉토리를 보통 파일처럼 읽는다.
skip : 디렉토리를 건너뛴다.
recurse : 디렉토리를 포함하여 하위 디렉터리의 모든 파일을 읽는다.
-e [패턴] : 하나 이상의 탐색 패턴을 지정한다. 단순한 패턴으로 동작하지만 패턴이 -로 시작할 때 유용하다.
-E : 확장 정규표현식으로 패턴을 해석한다.( = egrep 같은 의미)
-f [파일] : 패턴을 지정한 파일에서 가져온다.
-h : 패턴의 결과 목록만 보여주고 지정한 파일명은 출력하지 않는다.
-i : 대소문자의 구별을 하지 않는다.
-l : 일치하는 줄의 파일명만 보여주고, 줄의 내용은 출력하지 않는다.
-n : 일치하는 줄의 내용과 해당 줄의 위치를 출력한다.
-q : 결과를 출력하지 않는다.
-r : 각 디렉토리의 하위에 존재하는 파일들을 읽는다. -d recurse 옵션과 동일한다.
-s : 존재하지 않거나 읽을 수 없는 파일의 결과로 에러를 출력하지 않는다.
-v : 지정한 패턴과 일치하지 않는 내용을 보여준다.
-w : 지정한 패턴과 워드 단위로 일치하는 결과만을 보여준다.
-x : 패턴과 일치하는 전체 줄 수를 보여준다.
-y : -i 옵션과 동일한다.
< 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)
옵션의 예를 하나씩 보도록 하겠습니다.
test.txt 파일을 하나 생성합니다. 내용은 머 별거 없이 1 2 3 4 5 6 7 8 9 0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -0 을 각각 개행하여 입력 하도록 합니다.
그 파일을 위에 옵션을 하나씩 수행하여 결과를 확인해보도록 하겠습니다.
grep -A5 1 test.txt
<결과>
1
2
3
4
5
6
grep -B5 0 test.txt
<결과>
5
6
7
8
9
0
grep -b 0 test.txt
<결과>
18:0
grep -c 0 test.txt
<결과>
1
grep -C3 3 test.txt
<결과>
1
2
3
4
5
6
grep -e -1 test.txt
<결과>
-1
grep -E '1|3' test.txt
<결과>
1
3
-1
-3
grep -E '^1|^3' test.txt
<결과>
1
3
grep -E -e '-1|-3' test.txt
<결과>
-1
-3
pattern.txt 라는 파일을 만들어서 내용에는 1 을 저장한다.
grep -f pattern.txt test.txt
<결과>
1
-1
grep -r 1 . 여기서 -r 옵션을 사용한 이유는 디렉토리폴더의 하위부분을 탐색하지 않으면 현재 디렉토리 폴더라는 문구만 나오기 때문입니다.
<결과>
./pattern.txt:1
./test.txt:1
./test.txt:-1
grep -rh 1 .
<결과>
1
1
-1
-i 옵션은 굳이 머 결과까지 만들 필요는 없어 보이네요( 머 예제로 만든 파일이 전부 숫자라서 그런건 아님.... )
grep -lr 1 .
<결과>
./pattern.txt
./test.txt
grep -nr 1 .
<결과>
./pattern.txt:1:1
./test.txt:1:1
./test.txt:11:-1
grep -qr 1 .
<결과>
없음.
-r 옵션은 위에 예제들로 충분히 보여줬네요. 저는 기본적으로 디렉토리 검사할 때 사용하기 때문에 기본적으로 가장 많이 사용하는 옵션이 아닐까 생각합니다.
-s -w 옵션은 나중에 직업 해보시기 바랍니다.
grep -rv 1 .
<결과>
./test.txt:2
./test.txt:3
./test.txt:4
./test.txt:5
./test.txt:6
./test.txt:7
./test.txt:8
./test.txt:9
./test.txt:0
./test.txt:-2
./test.txt:-3
./test.txt:-4
./test.txt:-5
./test.txt:-6
./test.txt:-7
./test.txt:-8
./test.txt:-9
./test.txt:-0
grep -rx 1 .
<결과>
./pattern.txt:1
./test.txt:1