2/11/2015

grep 이용 검색

1. 기본사용법 

     grep은 기본사용법은 적은 찾고자 하는 패턴을 입력하고, 시작디렉토리를 입력하며, 검색을 시작한다.

     grep  option  expr  directory     // expr에 "" or ''을 넣어주어야 주어한다.

2. 기본옵션 

     -r 옵션은 순환적으로 밑에 디렉토리까지 검색하지만, 속도가 너무 느리다.
        만약 SSD이라면, 적극추천한다. 하지만 재귀에 문제로 너무 오래걸리는 것인지 동작이 멈춘 것인지 알수 없는 경우가 발생.

     -n output file의 line number를 알고 싶다면 -n으로 사용

     -b -n과 동일한 기능 같은데, newline이 포함안됨

     -E 옵션과 확장 패턴을 넣을수 있는데, 이때  AND 와 OR 연산을 사용가능.

       -E, --extended-regexp
              Interpret PATTERN as an extended regular expression
              * egrep과 동일하다고 한다. 

       -e PATTERN, --regexp=PATTERN
              Use PATTERN as the pattern.

       -b, --byte-offset
              Print the 0-based byte offset

       -n, --line-number
              Prefix each line of output with the 1-based line number 

       -R, -r, --recursive
              Read all files under each directory

       -v, --invert-match
              Invert the sense of matching, to select non-matching lines.

       -h, --no-filename
              Suppress the prefixing of file names on output.
              검색 list의 file 이름 제거

man에서 참고

3. 기본표현식 

     패턴은 regular expression이라고 부르며, 아래와 같은 meta-characters 사용이 가능하다.


   The period . matches any single character.

   Anchoring
       The caret ^ and the dollar sign $ are meta-characters that respectively match the empty string at the beginning and end of a line    

   Bracket Expressions
 
   [:digit:], [:graph:], [:lower:], [:print:], [:punct:], [:space:], [:upper:], and [:xdigit:]
   [0-9] 
   [0-9A-Za-z] 
   [aBbCcDd]   
   [0123456789]

   Repetition
   A regular expression may be followed by one of several repetition operators:
       ?      The preceding item is optional and matched at most once.   
       *      The preceding item will be matched zero or more times.       
       +      The preceding item will be matched one or more times.       
       {n}    The preceding item is matched exactly n times.
       {n,}   The preceding item is matched n or more times.
       {n,m}  The preceding item is matched at least n times, but not more than m times.

man에서 참고

4. 사용확장 
  • OR 연산
$ grep 'pattern1\|pattern2' filename
$ grep -E 'pattern1|pattern2' filename
$ egrep 'pattern1|pattern2' filename
$ grep -e pattern1 -e pattern2 filename
  • AND 연산
     grep에는 AND연산이 없지만, 유사하게 사용이 가능. ( '|' 사용 및 -E 와 '.*' 사용)
$ grep -E 'pattern1.*pattern2' filename
$ grep -E 'pattern1.*pattern2|pattern2.*pattern1' filename
$ grep -E 'pattern1' filename | grep -E 'pattern2'
  • NOT 연산 
$ grep -v 'pattern1' filename


5. 사용예제들

아래의 사용예제들은 AND와 NOT , 그리고 OR 연산을 사용하며, -r을 사용한다.
그리고 위의 메타데이타를 사용하기에 쉽게 검색이 된다.
grep은 find에 비해 검색속도가 상당히 많이 느리지만, SSD에서는 적극 추천한다.

단독사용도 가능하지만, find와 조합도 가능하고 다양한 조합도 가능하기 사용자의 능력인것 간다.


$ grep -r 'i2c.*sm.*wri*' .  //i2c와 sm과 wri가 3개의 패턴검색 (위의 AND 연산)

$ grep -Er 'i2c.*sm.*wri*' .     //현재 위와 동일하다

$ grep -r 'i2c.*sm.*wri*' . | grep -v "block"  // 위를 일차검색하고, block을 제외 

$ grep -r 'i2c*' . | grep -v "block"  //i2c 관련 검색을 하지만 block 제외

$ grep -r 'i2c.*write[0-9]' .    //i2c와 write0~9까지 의 패턴을 검색. 

$ grep -r 'i2c.*write[0-9]' .    //i2c와 write0~9까지 의 패턴을 검색.

$ grep -rE '(i2c|spi).*write[0-9]' . //i2c 나 spi  둘 중  write0~9와 패턴이 중복되는 것 검색


아래의 사이트 참고,

  http://www.thegeekstuff.com/2011/10/grep-or-and-not-operators/
  http://xero0212.tistory.com/26
  http://www.thegeekstuff.com/2009/03/15-practical-unix-grep-command-examples/