grep 사용법

grep 사용 예시

grep은 파일에서 패턴에 맞는 라인을 출력하는 유틸리티다.

사용법

grep [OPTION...] PATTERNS [FILE...]
grep [OPTION...] -e PATTERNS ... [FILE...]
grep [OPTION...] -f PATTERN_FILE ... [FILE...]

기본적으로 정규표현식을 사용하며, 옵션에 따라 확장 정규식(Extended Regular Expression), 펄 호환 정규식(PCRE, Perl-Compatible Regular Expression) 등을 쓸 수 있다.

grep을 쉘에서 사용할 때, 패턴은 일반적으로 quote로 감싸서 사용한다. ex) grep -E '*word*' file.txt

FILE 부분에 - 를 입력하면 stdin에서 읽는다.

정규표현식

정규표현식 내부에서 특별한 의미를 갖는 문자를 메타 문자(meta character)라고 하며, 정규식마다 약간의 차이가 있다.

1) 일반 정규표현식 (BRE, Basic Regular Expression)

대괄호([, ])

대괄호로 묶인 문자 목록 중 하나를 의미한다.

ex. [abc]: a, b, c 중 하나

캐럿(^, caret)

캐럿을 대괄호 안, 맨 앞 문자로 사용하면, 대괄호 안에 묶인 문자 빼고 아무 문자를 의미한다

ex. [^abc]: a, b, c가 아닌 문자 중 하나

캐럿이 대괄호 안에 있지 않다면 라인의 시작을 나타낸다

ex. ^abc: "abc"로 시작되는 라인. abcd -> (O), 1abc -> (X)

달러($)

달러는 라인의 끝을 나타낸다.

ex. abc$: abc로 끝나는 라인

하이픈(-, hyphen)

하이픈으로 구분된 두 문자는 범위를 나타낸다.

기본 C Locale(LC_ALL=C)에서는 [a-d][abcd]와 동일하지만, 많은 로케일은 사전 순으로 문자를 정렬하며, 따라서 일반적으로 [a-d][abcd]와 동일하지 않을 수 있다. 예를 들면 [aBbCcDd]가 될 수 있다.

ex. [a-d]: (일반적으로) a, b, c, d중 하나

반복

  • ?: 0개 또는 1개
  • *: 0개 이상
  • +: 1개 이상
  • {n}: n개
  • {n,}: n개 이상
  • {,m}: m개 이하
  • {n,m}: n개 이상, m개 이하

예를 들어 abc?d 는 abcd, abd 와 매칭된다.

대체

|(pipe) 연산자는 "OR" 연산자와 동일하다

예를 들어 [a|b]는 a 또는 b에 해당되는 문자를 찾는다

기타 미리 정의된 문자 클래스

미리 정의된 문자 클래스들이 있고, 괄호 안에서 특별한 의미를 갖는다. 예를 들어 C 로케일에서 [[:alnum:]]은 알파벳 + 숫자([0-9A-Za-z])와 동일하다.

  • [:alnum:]
  • [:alpha:]
  • [:blank:]
  • [:cntrl:]
  • [:digit:]
  • [:graph:]
  • [:lower:]
  • [:print:]
  • [:punct:]
  • [:space:]
  • [:upper:]
  • [:xdigit:]
Character Classes and Bracket Expressions (GNU Grep 3.10)
Character Classes and Bracket Expressions (GNU Grep 3.10)

자세한 설명은 위 페이지를 참고하자.

2) 확장 정규표현식 (ERE, Extended Regular Expression)

일반 정규표현식에서는 대괄호 밖의 ?, +, {, |, (, )는 다른 문자와 같은 문자로 인식된다. 백슬래시(\)로 이스케이핑 해야 메타 캐릭터로 쓸 수 있다.

-E 또는 --extended-regexp 옵션을 쓰면 확장 정규표현식을 사용할 수 있고, 이스케이핑 없이 메타캐릭터를 쓸 수 있다.

3) 펄 호환 정규표현식 (PCRE, Perl-compatible Regular Expression)

-P 옵션을 사용하면 펄 호환 정규표현식(PCRE)을 사용할 수 있다.

PCRE의 자세한 옵션들은 링크를 참고하자

보통 정규식의 Lookaround, Lookahead 옵션을 주고 싶을 때 많이 사용한다.


  • 1) Positive Lookahead - X(?=Y)

Positive Lookahead는 특정 패턴이 뒤에 있을때를 검색한다.

ex. apple(?=pie) : appie 뒤에 pie가 있을 때


  • 2) Negative Lookahead - X(?!Y)

Negative Lookahead는 특정 패턴이 뒤에 없을때를 검색한다

ex. apple(?!pie) : apple 뒤에 pie가 없을 때


  • 3) Positive Lookbehind - (?<=Y)X

Positive Lookbehind는 특정 패턴이 앞에 있을때를 검색한다

ex. (?<=apple)pie : pie 앞에 apple이 있을 때


  • 4) Negative Lookbehind - (?<!Y)X

Negative Lookbehind는 특정 패턴이 앞에 없을때를 검색한다.

ex) (?<!apple)pie : pie 앞에 apple이 없을 때

옵션

패턴

  • -E, --extended-regexp: 확장 정규표현식(ERE)을 사용한다
  • -F, --fixed-strings: 패턴을 정규표현식이 아닌 단순 문자열로 검색한다
  • -G, --basic-regexp: (기본값) 기본 정규표현식(BRE)을 사용한다
  • -P, --perl-regexp: 패턴을 펄 호환 정규표현식(PCRE)으로 사용한다

매칭 컨트롤

  • -e PATTERNS, --regexp=PATTERNS: PATTERNS를 패턴 문자열로 사용한다. -e 가 여러번 사용됐거나 -f 옵션과 함께 사용되는 경우, 주어진 모든 패턴을 사용한다.
  • -f FILE, --file=FILE: 파일에서 패턴을 읽어온다.  한 라인에 패턴 하나로 사용하며, -e 옵션과 함께 사용되는 경우, 주어진 모든 패턴을 사용한다.
  • -i, --ignore-case: 패턴에서 대소문자를 구별하지 않는다
  • --no-ignore-case: (기본값) 패턴에서 대소문자를 구분한다. -i 옵션과 같이 사용되면 이 옵션이 더 우선시 되어 대소문자를 구별하게 된다
  • -v, --invert-match: 패턴과 매칭되지 않는 라인만 갖고온다
  • -w, --word-regexp: 패턴이 단어 단위로 일치하는 라인만 선택한다. -x 옵션과 같이 사용된 경우, -w는 무시된다.
  • -x, --line-regexp: 패턴이 라인 전체와 일치하는 경우만 갖고온다. 정규표현식에서 ^패턴$ 이런식으로 쓰는 것과 동일하다

출력 컨트롤

  • -c, --count: 파일별로 매칭된 라인 수를 출력한다
  • --color[=WHEN], --colour[=WHEN]: 매칭된 문자열, 매칭된 라인 등을 터미널에 출력할 때 색상을 표시할지 아닐지를 설정한다. WHEN은 never, always, auto 중에 하나다. 색상은 GREP_COLORS로 지정할 수 있다.
  • -L, --files-without-match: 매칭되지 라인이 없는 파일 이름을 출력한다
  • -l, --files-with-matches: 매칭되는 라인이 있는 파일 이름을 출력한다.
  • -m NUM, --max-count=NUM: NUM 만큼 매칭되는 라인이 나오면 파일 읽기를 중단한다. NUM이 0이면 grep을 바로 중지한다. -1인 경우가 기본값이며, 이때는 무한대로 취급된다.
  • -o, --only-matching: 라인에서 매칭되는 부분만 출력한다.
  • -q, --quiet, --silent: 아무것도 출력하지 않는다. 매칭되는 라인을 찾으면 즉시 exit code 0으로 종료한다.
  • -s, --no-messages: 없는 파일 또는 읽을 수 없는 파일 관련 에러 메시지를 표시하지 않는다

출력 라인 Prefix 컨트롤

  • -b, --byte-offset: 매칭되는 라인의 0-based byte offset을 출력한다. -o (--only-matching) 옵션이 사용됐다면 매칭되는 부분의 오프셋을 출력한다.
  • -H, --with-filename: (검색하는 파일이 두개 이상인 경우, 기본값) 매칭되는 라인별 파일명을 출력한다
  • -h, --no-filename: 매칭되는 라인별 파일명을 출력하지 않는다.
  • --label=LABEL: 표준 입력에서 들어오는 입력을 LABEL 파일에서 들어온 것처럼 출력한다.
  • -n, --line-number: 파일에서 매칭되는 라인의 위치를 1-based로 출력한다
  • -T, --initial-tab: 매칭되는 내역 앞에 tab 문자를 추가해 매칭되는 라인들의 tab 정렬이 올바르게 나오도록 만든다. -H, -n, -b 옵션과 함께 사용했을 때 특히 유용하다.
  • -Z, --null: 파일명 뒤에 오는 문자 대신 ASCII NUL 문자를 출력한다. 예를 들어 grep -lZ는 파일명 뒤에 오는 newline 대신 NUL 문자를 출력하도록 변경된다. 이 옵션을 이용해 find -print0, perl -0, sort -z, xargs -0 등 파일명을 이용한 명령을 쓸 때 파일명에 newline 또는 다른 특수문자가 처리를 방해하는 것을 방지할 수 있다.

컨텍스트 라인 컨트롤

  • -A NUM, --after-context=NUM: 매칭되는 라인 뒤 NUM 줄의 라인을 출력한다.
  • -B NUM, --before-context=NUM: 매칭되는 라인 앞 NUM 줄의 라인을 출력한다.
  • -C NUM, -NUM, --context=NUM: 매칭되는 라인 앞, 뒤 NUM 줄의 라인을 출력한다.

위 옵션을 사용했을 때, 매칭되는 각 그룹은 group separator(그룹 분리자, --)로 분리되어 출력된다.

  • --group-separator=SEP: group separator를 --가 아닌 SEP 으로 출력한다
  • --no-group-separator: 라인 그룹 사이 group separator를 출력하지 않는다

이 옵션들은 -o (--only-matching) 옵션과 같이 사용되었을 때 무시된다.

파일, 디렉토리 선택

  • -a, --text: 바이너리 파일을 텍스트 파일인 것처럼 처리한다. --binary-files=text 옵션을 준 것과 동일하다
  • --binary-files=TYPE

파일의 데이터 또는 메타데이터에 파일에 바이너리 데이터가 포함되어 있다고 나오는 경우, 파일의 타입을 TYPE 으로 처리한다.

TYPE 기본값은 binary이며, 바이너리 파일인 경우 매칭되는 라인을 찾지 않는다. 또한 적절히 인코딩되지 않은 라인도 무시한다. 무시된 출력이 있는 경우, binary file matches 라는 에러 메시지를 출력한다

TYPE이 without-match인 경우, -I 옵션과 동일하다. 파일에서 바이너리 데이터를 찾게 되면 그 파일의 나머지는 매칭시키지 않는다.

TYPE이 text인 경우, 바이너리 파일이 텍스트 파일인 것처럼 처리한다. -a 옵션과 동일하다.

  • -D ACTION, --device=ACTION: 입력 파일이 device, FIFO, socket인 경우, ACTION으로 처리한다. 기본값은 read이고 일반 파일인 것처럼 처리한다. ACTION이 skip인 경우, 무시된다.
  • -d ACTION, --directories=ACTION: 입력 파일이 디렉토리인 경우, ACTION으로 처리한다. 기본값은 read이고 일반 파일인 것처럼 처리한다. ACTION이 skip인 경우, 무시된다. ACTION이 recurse인 경우, 폴더 아래의 파일들을 재귀적으로 읽으며, 이는 -r 옵션과 동일하다.
  • --exclude=GLOB: GLOB 패턴에 해당되는 파일은 무시한다
  • --exclude-from=FILE: 무시할 파일 GLOB 패턴들이 작성된 파일을 읽어 무시한다.
  • -I: 바이너리 파일은 매칭되지 않는 것처럼 처리한다. --binary-files=without-match와 동일하다.
  • --include=GLOB: GLOB 패턴에 해당되는 파일만 검색한다. --include, --exclude 옵션이 서로 상충된다면 마지막에 들어온 옵션만 적용된다.
  • -r, --recursive: 폴더 아래 파일들을 재귀적으로 검색한다. symlink는 커맨드라인에 주어지는 경우만 포함된다.
  • -R, --dereference-recursive: 폴더 아래 파일들을 재귀적으로 검색하며, 모든 symlink도 포함한다.

기타 옵션

  • --line-buffered: 라인 버퍼를 쓴다. (버퍼에 개행문자가 들어올 때 파일에 읽고 쓰는 식). 기존보다 성능이 저하될 수 있음
  • -U, --binary: 파일을 바이너리 타입으로 다룬다. MS-DOS, MS-Windows에서만 동작한다. 위도우즈에서는 line ending으로 CRLF를 쓰고 리눅스에서는 LF만 쓰기 때문에 grep은 기본적으로 CR 캐릭터를 무시해 정규식에서 ^, $이 정상 동작하도록 하는 로직이 있는데, -U 옵션을 주면 이 동작을 없애고 원본 그대로 정규식 검색을 한다. 이 옵션을 주면 정규식이 의도대로 동작하지 않을 수 있어 주의가 필요하다.
  • -z, --null-data: 입출력 데이터를 각 라인이 newline 대신 ascii NUL 캐릭터로 구분된 것으로 다룬다. -Z 옵션처럼 sort -z 등의 커맨드로 임의의 문자가 포함될 수 있는 파일명을 다룰 때 활용할 수 있다.

Reference