C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[110] [팁] GREP.EXE 사용법 정리
박지훈.임프 [cbuilder] 8732 읽음    2001-07-26 14:49
이 팁은 담비님(천리안 FREKBS)님이 98년 12월 30일에 천리안 프로그래머포럼에 올리신 것입니다.
담비님으로부터는 전제하여 올리는 데 대해 허락을 받았습니다.
좋은 정보를 공유하도록 허락해주신 담비님께 감사드립니다.

-----------------------------------------------------------------------
안녕하세요! 담비입니다.

본 문서는 GREP.EXE의 사용법을 정리한 내용입니다.
IDE에 있는 Search : Find in Files와 동일한 기능을 하는 command line utility
입니다.  아주 유용한 도구이므로 다른 프로그램과 연결하여 사용이 가능하다면
훌륭한 팀을 이루어 작업을 하게될것입니다.
GREP에 사용되어지는 옵션문자(Special Strings)들은 Search : Find in Files에서
나타나는 대화상자에서도 그대로 적용하여 사용할 수 있습니다.
이제 단순히 하나의 단어나 문장을 입력하여 검색하던 초보의 수준을 넘어
고급 사용자가 되어보십시요.

본 문서는 C++ Builder와 함께 제공되어지는 도움말 파일을 기초로 작성되었으며
내용상의 오류 혹은 추가 및 변경되어져야 할 사항을 발견하시면 메일 주시면
감사하겠습니다. 보내주신 내용은 검토 후 반영하여 다시 올리도록 하겠습니다.

  frekbs@chollian.net

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
GREP(Global Regular Expression Print)은 동일한 이름을 가진 UNIX의 유틸리티에서
파생된 막강한 텍스트 검색 프로그램이다. GREP은 하나나 그 이상의 파일 또는
Standard input stream 에서 텍스트 패턴을 찾아준다.
GREP을 사용하기 원한다면 여기 빠른 예제가 있다. 만일 현재 디렉토리 내에 있는
파일들중에서 "Bob"라는 단어를 가진 파일을 찾는다고 가정한다면 아래와 같이
입력하면 된다.

    grep Bob *.txt

GREP은 "Bob"이라는 단어를 가진 각각의 파일에 있는 라인의 리스트로 응답한다.
GREP은 기본적으로 문자의 대소를 구별하므로 "bob"과 "boB"는 일치하지 않는다.
GREP은 일치하는 하나 이상의 또는 고정된 스트링을 찾을 수 있다.
GREP은 특별한 형식을 갖는 어떤 스트링을 찾게할수도 있다.
GREP에 사용하는 일반적인 command line 문장은 다음과 같다.

       grep [-options] searchstring [file(s) ... ] or @filelist

───────┬───────────────────────────────
  Option       │  Description
───────┼───────────────────────────────
  options      │  GREP의 움직임을 바꾸는 하이픈(-)에 의해 선행되어진 하나이상의
               │  문자로 구성된다.
  searchstring │  검색을 위한 패턴을 지정한다.
  file(s)      │  GREP이 검색할 대상파일을 지시한다.(만일 파일을 명시하지
               │  않는다면 GREP은 스탠더드 인풋에서 검색을 하는데 이것은
               │  파이프(:)와 리디렉션(<,>)을 사용할 수 있게 해준다.
───────┴───────────────────────────────
GREP ? 명령은 GREP 사용을 위한 기본값과, 특수 문자들 그리고 옵션들을 보여주는
도움말 화면을 출력한다.

GREP의 출력화면을 리디렉션하기
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
만일 GREP을 사용하여 찾은 결과가 한 화면을 넘는다면 파일로 출력을 재지시할 수
있다. 예를 들면 다음 명령을 사용한다면,

    GREP "Bob" *.txt > temp.txt

현재 디렉토리안에 있는 모든 TXT 화일을 검색하고 나서 그 결과를 TEMP.TXT라는
화일에 기록한다.(이 화일의 이름은 마음대로 지정할 수 있다.) TEMP.TXT를 읽기
위해서 워드 프로세서를 사용한다.(검색의 결과파일)

---------------
  명령라인 옵션
---------------
하이픈(-)에 의해 선행되어진 하나 이상의 단일 문자를 지정하여 명령라인 상에서
GREP 유틸리티에 옵션을 전달할 수 있다. 각각의 문자는 기능을 On/Off 시키는
스위치이다. 하나의 문자 뒤에 오는 플러스(+) 기호는 옵션을 On 시키고 하이픈(-)
기호는 옵션을 Off 시킨다.
플러스 기호는 선택적이다. 예를 들어 -r은 -r+과 동일한 일을 한다. 개개의 옵션을
여러개 열거할수(-i -d -l) 있으며 그것들을 조합할수도(-ild or -il, -d)있다.

다음은 GREP의 옵션 문자와 그 의미이다.

────┬──────────────────────────────────
  Option │Description
────┼──────────────────────────────────
  -c     │카운트만 한다. 오직 일치하는 줄의 수만을 출력한다. GREP은 적어도
         │한줄 이상 일치하는 각각의 파일을 위해 파일 이름과 일치하는 줄의 수를
         │카운트하여 출력한다. 일치하는 줄은 줄력되지 않는다. 이 옵션의 기본값
         │은 off이다.
────┼──────────────────────────────────
  -d     │하위 디렉토리를 검색한다. 명령라인상에 명시되어진 각각의 파일을 위해
         │GREP은 명시된 디렉토리와 그 디렉토리의 밑에 있는 모든 하위 디렉토리
         │에서 열거된 파일과 일치하는 모든 파일들을 검색한다. 만일 패스의 지정
         │없이 파일만이 주어진다면 GREP은 그 파일이 현재의 디렉토리에 있다고
         │생각한다. 이 옵션의 기본값은 off이다.
────┼──────────────────────────────────
  -e     │뒤에 오는 수식으로 검색한다. 다음에 있는 아규먼트는 검색 수식을 나타
         │낸다. 이 옵션은 "-"으로 시작하는표현식을 사용하여 검색하고자 하는경우
         │유용하다.
────┼──────────────────────────────────
  -i     │문자의 대/소를 구별하지 않는다. GREP이 문자의 대/소를 무시한다. 이
         │옵션이 설정된 경우, GREP은 모든 상태에서 A 에서 Z 에 대응하는 동일한
         │문자로서 모든 a 에서 z 까지를 취급한다. 이 옵션의 기본값은 off이다.
────┼──────────────────────────────────
  -l     │파일 이름만을 보여준다. 일치하는 사항을 가지는 각 파일의 이름만을
         │출력한다. GREP은 일치하는것을 찾은 후 파일의 이름을 출력하고 즉시
         │다음 파일로 이동하여 검색을 한다. 이 옵션의 기본값은 off이다.
────┼──────────────────────────────────
  -n     │일치하는 행번을 출력한다. GREP은 각각의 일치하는 줄에대한 행번을
         │출력한다. 이 옵션의 기본값은 off이다.
────┼──────────────────────────────────
  -o     │UNIX 형식으로 출력한다. UNIX 스타일의 명령라인 파이프를 더 쉽게 제공
         │하도록 일치하는 줄의 출력형식을 변경한다. 출력되는 모든 줄은 일치하는
         │줄을 가진 파일의 이름을 먼저 출력한다. 이 옵션의 기본값은 off이다.
────┼──────────────────────────────────
  -r     │규칙적인표현식으로 검색한다. 검색문장에의해 정의된 문장은 한자 한자의
         │문장 대신에 규칙적인 표현식으로서 취급되어진다. 이 옵션은 기본값이다.
         │규칙적인 수식은 인용부호로 싸여진 임의의 하나 이상의 문자들에게서
         │발생한다. 다음의 기호들은 특별하게 취급된다.
         │  ^  줄의 시작
         │  $  줄의 마지막
         │  .  임의의 문자
         │  \  다음에 오는 문자를 인용한다.
         │  *  일치하는것이 없거나 있을수 있다.
         │  +  하나 이상 일치한다.
         │  [aeiou0-9]   a, e, i, o, u, 그리고 0 부터 9 까지중 하나가 일치한다.
         │  [^aeiou0-9]  a, e, i, o, u, 그리고 0 부터 9 까지를 제외하고 일치.
────┼──────────────────────────────────
  -u fnm │Update 옵션. fnm.EXE로 이름진 GREP.EXE의 복사본을 생성한다. 명령라인
         │에 포함된 임의의 옵션들이 새로운 GREP의 사본에 기본값으로 저장된다.
         │기본 옵션의 설정들을 조절하기 위하여 -u 옵션을 사용한다. 지정한 기본
         │설정이 정확하게 되었는지를 확인하기 위하여 fnm ? 라고 입력하면,
         │도움말 화면에 나타나는 각 옵션들은 그들의 기본값 설정을 구분하는
         │+ 또는 - 와 함께 출력된다.
────┼──────────────────────────────────
  -v     │불일치. 오직 일치하지 않는 줄만을 출력한다.  일치하는 검색 문장을
         │가지고 있지 않은 불일치하는 줄들만을 출력한다. 이 옵션의 기본값은
         │off이다.
────┼──────────────────────────────────
  -w     │단어의 검색.규칙적인 표현식식과 일치하는 선행되어지는 문자가 있는
         │문장을 찾는다. 연속되어지는 문자는 단어의 일부분이 될수 없다.
         │기본적인 문자세트 단어는 A 부터 Z, 0 부터 9 그리고 underscore(-)이다.
         │이 옵션의 기본값은 off이다. 이 옵션을 번갈아 사용하는것은 개개의 단어
         │문자들을 지정할 수 있게 해준다. 형태는 -w[set]이며, set은유효한표현식
         │을 설정한다.  만일 알파벳 문자들의 설정을 지정한다면 대소문자를 구별
         │하여 검색하도록 설정되었다 할지라도,설정된 각 글자들을 위한 대/소문자
         │의 값으로 자동으로 정의된다.(대/소문자 어느것으로 설정되었는지에
         │관계없이) 만일 -u와 -w 옵션을 함께 사용한다면 각 글자들에 대한 새로운
         │설정이 기본값으로 저장된다.
────┼──────────────────────────────────
  -z     │장황하다. GREP은 검색한 모든 파일의 이름을 출력한다. 각각의 일치하는
         │줄은 행번이 선행되어진다. 각 파일에 일치하는 줄의 0일지라도 줄의 수를
         │출력한다. 이 옵션의 기본값은 off이다.
────┼──────────────────────────────────
  ?      │GREP의 기본값과 옵션, 특수 문자들을 보여주는 도움말 화면을 출력한다.
────┴──────────────────────────────────

---------------
   검색  문자
---------------
검색 문자의 값은 GREP이 검색할 것에 대한 형태를 정의한다. 검색 문자는 규칙적인
표현식이나 문장이 되어질 수 있다.
. 규칙적인 표현식에서는 확실하게 문자들은 특별한 의미를 가지며 검색방법에 관한
   연산자들이다.
. 문장에서는 연산자가 없으며 각 문자들은 문자에 구애되어 취급되어진다.
구획문자로 취급되어지는 스페이스와 탭을 보호하도록 쿼테이션(")안에 검색 문장을
넣을 수도 있다. "-"로 시작하는 표현을 검색하기 위해 -e 옵션을 사용한다.
검색 문자와 일치되는 문장은 여러줄의 범위일 수 없으며 검색 형식과 일치하는 모든
문장은 동일한 줄에 있어야만 한다. 규칙적인 표현식은 하나의 문자이거나 bracket
으로 싸여진 문자들의 집합니다. 연결된 규칙적인 표현식도 하나의 규칙적인 표현식
이다. -r옵션을 사용한 경우(기본으로 설정된다.), 검색 문자는 규칙적인 표현식으로
취급된다.(문자 표현식이 아니다.) 다음의 문자들은 특별한 의미를 갖는다.
───────────────────────────────────────
Symbol   Description
───────────────────────────────────────
   ^    표현식의 시작에 위치한 써컴플렉스(circumflex:^)는  줄의 시작과 일치한다.
   $    표현식의 마지막에 위치한 달러는 줄의 마지막과 일치한다.
   .    피리어드(period)는 어떤 문자와도 일치한다.
   *    문자 다음에 오는 아스테리스크(asteris) 연속되어지는 임의의 글자가
        발생하는 0개의 문자수를 포함하는 임의의 개수와 일치한다. 예를 들어 bo*는
        bot, boo등 bo로 시작하는 문자들과 일치한다.
   +    문자 뒤에 오는 플러스는(+) 0개의 문자들을 포함하여 발생하는 임의의
        수자의 문자와 일치한다. 예를 들어 bo+는 bot 와 boo는 가능하지만 b 또는
        bo는 제외된다.
  { }   브레이스({,})에 의해 둘러싸인 문자들이나 표현식은 조절되어질수 있는
        검색 형식의 평가를 위하여 그룹지어질 수 있고 그렇게 그룹지어진 문장은
        수에 의해 참조되어질 수 있다.
  [ ]   브라켓([,])안의 문자들은 브라켓 안에서 나타나는 임의의 한 문자와
        일치한다. 그러나 브라켓내에 없는 문자는 일치하지 않는다.
        예를들어 [bot]는 b, o 또는 t와 일치한다.
  [^]   브라켓 내에서 문자의 시작에 위치한 써컴플렉스는 NOT을 의미한다.
        그러므로 [^bot]는 b, o 또는 t를 제외한 임의의 문자와 일치한다.
  [-]   브라켓 내에있는 하이픈(-)은 문자들의 범위를 지정한다.
        예를 들어 [b-o]는 b 부터 o까지의 임의의 문자와 일치한다.
   \    와일드 캐릭터 전의 백슬래쉬는 GREP에게 와일드카드로서가 아닌 문장으로
        으로서 취급할것을 지시한다. 예를 들어, \^는 ^와 일치하고 문장의 시작을
        찾는(이 표의 처음에 나오는 설명)것은 아니다.
───────────────────────────────────────
$, ., *, +의 네가지 특수 문자들은 브라켓 셑트 내에서 사용되어진 경우에는 특별한
의미를 갖지 않는다. 추가적으로, ^는 오직  표현식 설정의 시작에 나오는 경우에만
특별게 취급된다.

---------------
   파일의 지정
---------------
files 옵션은 GREP이 검색을 지시한 파일들에게서 할것을 지시한다. files는 확실한
파일이름이나 DOS의 ?와 * 와일드카드와 결합한 일반적인 파일 이름이 되어질 수
있다. 추가적으로 패스(드라이브와 디렉트리정보)를 입력할 수 있다. 만일 패스 없이
파일들의 리스트만을 사용한경우 GREP는 현재 디렉토리를 검색한다. 만일 파일들을
명시하지 않은 경우 vertical bar(:)나 리디렉션(<)으로부터 입력받아야만 한다.

---------------
   사용  예제
---------------
다음의 예제들은 서로 다른 검색 상황을 GREP으로 어떻게 결합하여 사용하는가를
보여준다. GREP의 기본 설정을 바꾸지 않았을것이라고 확신한다.(-u를 사용하여)

  grep -r "[^a-z]main\ *\(" *.c
━━━━━━━━━━━━━━━━
일치하는것들
──────
   main(i,j:integer)
   if (main  ()) halt;
   if (MAIN  ()) halt;

일치하지 않는것
────────
   mymain()

설명
──
검색 문장은 GREP에게 선행하는 소문자들이 없는([^a-z]) main 이라는 단어를,
빈 공간이 하나 이상 연속되어지고(\ *)난 후 왼쪽 괄호가 있는 경우를 검색하라고
지시한다. 스페이스나 탭은 명령라인의 구획분자로서 정상적으로 고려되어져야하므로
만일 그들을 규칙적인 수식의 일부로 포함하여 사용하고자 한다면 반드시 인용부호를
사용해야만 한다.

~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~

grep -ri [a-c]:\\data\.fil *.c *.inc
━━━━━━━━━━━━━━━━━━
일치하는것들
──────
   A:\data.fil
   B:\DATA.FIL
   c:\Data.Fil

일치하지 않는것
────────
   d:\data.fil
   a:data.fil

설명
──
백슬래쉬(\)와 피리어드(.) 문자로 인하여 보통은 파일 이름과 패스에 특별한 의미를
가지게 된다. 만일 백슬래쉬나 피리어드를 찾고자 한다면 그들의 앞에 백슬래쉬
이스케이프 문자를 놓아야한다.  이 예에서 사용된 -i 옵션은 대소문자를 무시하고
검색한다.

~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~

grep "search string with spaces" *.doc *.c
━━━━━━━━━━━━━━━━━━━━━
일치하는것들
──────
   This is a search string with spaces in it.

일치하지 않는것
────────
   This search string has spaces in it.

설명
──
이 예는 스페이스들이 포함된 경우 어떻게 찾는가를 보여준다.

~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~

grep -rd "[ ,.:?'\"]"$ \*.doc
━━━━━━━━━━━━━━━
일치하는것들
──────
   He said hi to me.
   Where are you going?
   In anticipation of a unique situation,
   Examples include the following:
   "Many men smoke, but fu man chu."

일치하지 않는것
────────
   He said "Hi" to me
   Where are you going? I'm headed to the

설명
──
이 예제는 줄의 마지막에 있는 임의의 문자 하나  ".:?', 를 검색한다.
범위 내에 있는 더블 쿼트(")는 검색 문장의 마지막을 의미하는 대신에 일반적인
문자로서 취급되어지도록 이스케이프 문자가 선행되어진다. 또한 $문자는 인용된
문장의 바깥에 나타난다. 이것은 규칙적인 수식들이 긴 수식에서 어떻게 연결되어질
수 있는가를 설명한다.

~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~

grep -w[=] = *.c
━━━━━━━━
일치하는것들
──────
   i = 5;
   j=5;
   i += j;

일치하지 않는것
────────
   if (i == t) j++;
   /* =================== */

설명
──
이 예제는 오직 연산자(=)로 할당되어진 단어를 사용하기위해 개별 문자들의 현재
설정을 재정의한 후 단어를 검색한다. 그것은 단일 이퀄(=) 부호를 사용한 C의
할당문과 일치하지만 이중 이퀄(==) 부호를 사용한것은 동일하게 시험되지 않는다.


+ -

관련 글 리스트
110 [팁] GREP.EXE 사용법 정리 박지훈.임프 8732 2001/07/26
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.