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. egrep
egrep은 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. fgrep
fgrep는 문자열로만 검색을 한다. 문자열 부분에 위치한 모든 문자를 "문자로써"취급한다. 즉, 정규표현식의 메타문자도 일반문자로 취급한다. fgrep은 문자열로만 검색하기 때문에 검색속도가 빠르다는 장점이 있다.
6. 참고
(1)정규 표현식에서 메타문자(& ! . * ? $ 및 \) 앞에 백슬래시(\)를 나타내면 grep으로 하여금 그것의 특수 의미를 무시하도록 한다.
ex) grep ^\. // 마침표로 시작되는 줄을 찾음
grep '\$' // "$" 문자가 포함된 줄을 찾음
(2)패턴을 작성할 때 \(역슬래쉬)가 들어가는 경우(\<, \(..\), x\{m\} 이러한 표현식 등)나, 특수문자를 문자자체로 인식하게 하려 \을 사용하는 경우, 패턴에 있어서 파이프( | )를 이용하는 경우에는 패턴을 따옴표(")나 작은 따옴표(')로 감싸주어야 한다.
원본URL : Geundi
'리눅스' 카테고리의 다른 글
socat 명령어(proxy) (0) | 2020.10.06 |
---|---|
리눅스 password hashing 알고리즘 변경하기 (0) | 2020.10.05 |
nginx에서 limit_conn 및 limit_req 모듈 사용하기 (0) | 2020.10.05 |
docker rmi 명령어 (0) | 2020.10.05 |
docker system prune 명령어 (0) | 2020.10.05 |