BASH 명령 의 즐거움 (3) 의 grep

13164 단어
용법: grep [옵션]... PATTERN [FILE]...
모든 파일 이나 표준 입력 에서 PATTERN 을 찾 습 니 다.
     수천 줄 에 달 하 는 파일 에서 어떤 단어 나 필요 한 것 을 찾 고 싶다 면, 더 나 아가 디 렉 터 리 아래 수천 개의 파일 에서 파일 에 일치 하 는 조건 (PATTERN) 을 찾 습 니 다. grep 는 UNIX 에서 텍스트 검색 에 사용 할 마스터 급 도구 로 서 첫 번 째 선택 입 니 다!
      grep 는 정규 표현 식 과 마스크 를 받 아들 일 수 있 습 니 다. 이 강력 한 도 구 를 어떻게 사용 하 는 지 구체 적 으로 배 울 수 있 습 니 다.
1. 옵션
          :
  -E, --extended-regexp     PATTERN             (    ERE)
  -F, --fixed-strings       PATTERN                。
  -G, --basic-regexp        PATTERN           (    BRE)
  -P, --perl-regexp         PATTERN     Perl      
  -e, --regexp=PATTERN        PATTERN        
  -f, --file=FILE             FILE     PATTERN
  -i, --ignore-case              
  -w, --word-regexp            PATTERN        
  -x, --line-regexp            PATTERN        
  -z, --null-data              0       ,     
기타 옵션:
-v, --invert-match              PATTERN(  )  
-n, --line-number               
-o, --only-matching                   
-c                                        (          )
-l, --files-with-matches       FILES     (      )
-b, --byte-offset                         
-r, --recursive             ,like --directories=recurse
-R, --dereference-recursive  likewise, but follow all symlinks
      --include=FILE_PATTERN       FILE_PATTERN    
      --exclude=FILE_PATTERN      FILE_PATTERN       
      --exclude-from=FILE        FILE      
      --exclude-dir=PATTERN        PATTERN    。


 여전히 이전 글 vim 강력 한 탐구 커서 이동   테스트 텍스트 로 사용 할 인 스 턴 스:
liujl@liujl-ThinkPad-Edge-E431:~/mybash$ cat greptest.txt 
 1、I am eagerly awaiting my next disappointment. —Ashleigh Brilliant  
 2、Every man’s memory is his private literature. —Aldous Huxley  
 3、Life is what happens to you while you’re busy making other plans. —John Lennon  
 4、Life is really simple, but we insist on making it complicated. —Confucius  
 5、Do not dwell in the past, do not dream of the future, concentrate the mind on the  
 6、present moment. —Buddha  
 7、The more decisions that you are forced to make alone, the more you are aware of  
 8、your freedom to choose. —Thornton Wilder

2. 조작
1) 파일 에서 단 어 를 찾 습 니 다:
liujl@liujl-ThinkPad-Edge-E431:~/mybash$ grep past greptest.txt 
 5、Do not dwell in the past, do not dream of the future, concentrate the mind on the 
stdin 에서 도 읽 을 수 있 습 니 다.
liujl@liujl-ThinkPad-Edge-E431:~/mybash$ echo -e “this is a grep testthe next line” |grep line “this is a grep testnthe next line”
하나의 grep 명령 으로 여러 파일 을 검색 할 수 있 습 니 다:
$grep "match_text" file1 file2 file3 ...
일치 문자 로 일치 할 수 있 습 니 다. 이 옵션 은 위 에서 언급 한 옵션 - E 를 사용 해 야 합 니 다.
liujl@liujl-ThinkPad-Edge-E431:~/mybash$ grep -E "Aldou[sde]" greptest.txt 
 2、Every man’s memory is his private literature. —Aldous Huxley 
또는
liujl@liujl-ThinkPad-Edge-E431:~/mybash$ echo "This is a grep test." | grep -E "[a-z]+\." This is a grep test.
grep - E 는 egrep 로 대체 할 수 있 습 니 다.
출력 파일 에 일치 하 는 텍스트 부분 은 옵션 - o 를 사용 할 수 있 습 니 다. 예 를 들 어:liujl@liujl-ThinkPad-Edge-E431:~/mybash$ echo "This is a grep test." | grep -o -E "[a-z]+\." test.
일치 하 는 줄 이외 의 모든 줄 을 인쇄 합 니 다. 사용 - v 옵션:
liujl@liujl-ThinkPad-Edge-E431:~/mybash$ grep -E -v  "Aldou[sde]" greptest.txt 
 1、I am eagerly awaiting my next disappointment. —Ashleigh Brilliant  
 3、Life is what happens to you while you’re busy making other plans. —John Lennon  
 4、Life is really simple, but we insist on making it complicated. —Confucius  
 5、Do not dwell in the past, do not dream of the future, concentrate the mind on the  
 6、present moment. —Buddha  
 7、The more decisions that you are forced to make alone, the more you are aware of  
 8、your freedom to choose. —Thornton Wilder
일치 하 는 두 번 째 줄 을 인쇄 하지 않 았 습 니 다.
 파일 이나 텍스트 에 일치 하 는 문자열 을 포함 하 는 줄 수 를 통계 합 니 다. 옵션 - c 를 사용 하 십시오.
liujl@liujl-ThinkPad-Edge-E431:~/mybash$ grep -c is greptest.txt 
5
일치 하 는 문자열 을 포함 하 는 줄 수 를 출력 합 니 다. - n 옵션 을 사용 하 십시오.
liujl@liujl-ThinkPad-Edge-E431:~/mybash$ grep -n -o is greptest.txt 
1:is
2:is
2:is
3:is
4:is
4:is
7:is

위치 한 문자 나 바이트 와 일치 하 는 오프셋 을 인쇄 합 니 다. - b 옵션 을 사용 하 십시오.liujl@liujl-ThinkPad-Edge-E431:~/mybash$ grep -b -o is greptest.txt
36:is
101:is
105:is
157:is
247:is
275:is
459:is

옵션 - b 항상 - o 와 함께 사용
여러 파일 을 검색 하고 일치 하 는 텍스트 가 어느 파일 에 있 는 지 찾 으 려 면 - l 옵션 을 사용 하 십시오.
liujl@liujl-ThinkPad-Edge-E431:~/mybash$ grep -l is greptest.txt out.txt 
greptest.txt

3. 기타 옵션 기능
1) 재 귀적 검색 파일, - R, - r
liujl@liujl-ThinkPad-Edge-E431:~/  /linux-3.10$ grep "epoll" . -R -n
./fs/eventpoll.c:47: * There are three level of locking required by epoll :
./fs/eventpoll.c:62: * during epoll_ctl(EPOLL_CTL_DEL) and during eventpoll_release_file().
./fs/eventpoll.c:65: * This mutex is acquired by ep_free() during the epoll file
./fs/eventpoll.c:67: * if a file has been pushed inside an epoll set and it is then
./fs/eventpoll.c:68: * close()d without a previous call to epoll_ctl(EPOLL_CTL_DEL).
./fs/eventpoll.c:69: * It is also acquired when inserting an epoll fd onto another epoll
./fs/eventpoll.c:70: * fd. We do this so that we walk the epoll tree and ensure that this
./fs/eventpoll.c:71: * insertion does not create a cycle of epoll file descriptors, which
。。。 。。。

이 명령 은 개발 자가 가장 많이 사용 하 는 명령 으로 어떤 원본 파일 에 있 는 텍스트 를 찾 을 수 있 습 니 다.
2) 스타일 의 대소 문자 무시, - i
liujl@liujl-ThinkPad-Edge-E431:~/  /linux-3.10$ echo This is a grep line. |grep -i "LINE"
This is a grep line.

3) 여러 스타일 과 일치 하 는 - e
liujl@liujl-ThinkPad-Edge-E431:~/mybash$ grep -e "Life" -e "more" greptest.txt
 3、Life is what happens to you while you’re busy making other plans. —John Lennon  
 4、Life is really simple, but we insist on making it complicated. —Confucius  
 7、The more decisions that you are forced to make alone, the more you are aware of 
더하기 - o (끝까지 추가 해 야 함)
liujl@liujl-ThinkPad-Edge-E431:~/mybash$ grep -e "Life" -e  "more" greptest.txt -o
Life
Life
more
more

4) grep 에서 파일 포함 또는 제거 검색
--include=FILE_PATTERN  일치 하 는 FILE 만 찾기PATTERN 파일 -- exclude = FILEPATTERN  일치 하 는 FILE 건 너 뛰 기PATTERN 의 파일 과 디 렉 터 리 는 현재 디 렉 터 리 와 하위 디 렉 터 리 에서. h 와. c 로 끝 나 는 모든 파일 을 검색 합 니 다. 이 파일 들 에 'poll' 문자열 이 있 는 줄 을 검색 합 니 다. 예제 에 따라 검색 합 니 다. 다음 과 같 습 니 다.liujl@liujl- ThinkPad - Edge - E431: ~ / download / linux - 3.10 / fs $grep "poll". - r -- include  *.{h,c} liujl@liujl- ThinkPad - Edge - E431: ~ / 다운로드 / linux - 3.10 / fs $는 아무런 결과 가 없습니다. 단일 검색 시:liujl@liujl- ThinkPad - Edge - E431: ~ / download / linux - 3.10 / fs $grep "poll". - r -- include  *.h liujl@liujl- ThinkPad - Edge - E431: ~ / 다운로드 / linux - 3.10 / fs $도 결과 가 없 는데 그게 무슨 이유 입 니까?다음 검색:
liujl@liujl-ThinkPad-Edge-E431:~/  /linux-3.10/fs$ grep "poll" . -r --include  "*.h"
./mount.h:#include <linux/poll.h>
./mount.h:      wait_queue_head_t poll;
./cachefiles/internal.h:        wait_queue_head_t               daemon_pollwq;  /* poll waitqueue for daemon */
./cachefiles/internal.h:#define CACHEFILES_STATE_CHANGED        3       /* T if state changed (poll trigger) */
./cachefiles/internal.h:        wake_up_all(&cache->daemon_pollwq);
./gfs2/glock.h:extern int gfs2_glock_poll(struct gfs2_holder *gh);
./fuse/fuse_i.h:#include <linux/poll.h>
。。。  。。。

또는:
liujl@liujl-ThinkPad-Edge-E431:~/  /linux-3.10/fs$ grep "poll" . -r --include  "*.h" --include "*.c" |more
./lockd/clntlock.c:      * to lose callbacks, however, so we're going to poll from
./mount.h:#include <linux/poll.h>
./mount.h:      wait_queue_head_t poll;
./pipe.c:#include <linux/poll.h>
./pipe.c:                       wake_up_interruptible_sync_poll(&pipe->wait, POLLOUT | POLLWRNORM);
./pipe.c:               wake_up_interruptible_sync_poll(&pipe->wait, POLLOUT | POLLWRNORM);
./pipe.c:                       wake_up_interruptible_sync_poll(&pipe->wait, POLLIN | POLLRDNORM);
./pipe.c:               wake_up_interruptible_sync_poll(&pipe->wait, POLLIN | POLLRDNORM);
./pipe.c:pipe_poll(struct file *filp, poll_table *wait)
./pipe.c:       poll_wait(filp, &pipe->wait, wait);
./pipe.c:                * behave exactly like pipes for poll().
./pipe.c:               wake_up_interruptible_sync_poll(&pipe->wait, POLLIN | POLLOUT | POLLRDNORM | POLLWRNORM | POLLERR | POLLHUP);
./pipe.c:       .poll           = pipe_poll,
./ncpfs/sock.c:#include <linux/poll.h>
。。 。   。。。

정확 한 결 과 를 찾 을 수 있 습 니 다.
그럼 시도 -- include = FILEPATTEN 형식:
liujl@liujl-ThinkPad-Edge-E431:~/  /linux-3.10/fs$ grep "poll" . -r --include=*.{h,c} | more
./lockd/clntlock.c:      * to lose callbacks, however, so we're going to poll from
./mount.h:#include <linux/poll.h>
./mount.h:      wait_queue_head_t poll;
./pipe.c:#include <linux/poll.h>
./pipe.c:                       wake_up_interruptible_sync_poll(&pipe->wait, POLLOUT | POLLWRNORM);
./pipe.c:               wake_up_interruptible_sync_poll(&pipe->wait, POLLOUT | POLLWRNORM);
./pipe.c:                       wake_up_interruptible_sync_poll(&pipe->wait, POLLIN | POLLRDNORM);
./pipe.c:               wake_up_interruptible_sync_poll(&pipe->wait, POLLIN | POLLRDNORM);
./pipe.c:pipe_poll(struct file *filp, poll_table *wait)
./pipe.c:       poll_wait(filp, &pipe->wait, wait);
./pipe.c:                * behave exactly like pipes for poll().
./pipe.c:               wake_up_interruptible_sync_poll(&pipe->wait, POLLIN | POLLOUT | POLLRDNORM | POLLWRNORM | POLLERR | POLLHUP);
./pipe.c:       .poll           = pipe_poll,
./ncpfs/sock.c:#include <linux/poll.h>
。。。  。。。

위의 동작 은 결 과 를 검색 하거나 find 와 xargs 로 조합 할 수 있 습 니 다.
liujl@liujl-ThinkPad-Edge-E431:~/  /linux-3.10/fs$ find . -name "*.h" -o -name "*.c" |xargs grep "poll" | more
./lockd/clntlock.c:      * to lose callbacks, however, so we're going to poll from
./mount.h:#include <linux/poll.h>
./mount.h:      wait_queue_head_t poll;
./pipe.c:#include <linux/poll.h>
./pipe.c:                       wake_up_interruptible_sync_poll(&pipe->wait, POLLOUT | POLLWRNORM);
./pipe.c:               wake_up_interruptible_sync_poll(&pipe->wait, POLLOUT | POLLWRNORM);
./pipe.c:                       wake_up_interruptible_sync_poll(&pipe->wait, POLLIN | POLLRDNORM);
./pipe.c:               wake_up_interruptible_sync_poll(&pipe->wait, POLLIN | POLLRDNORM);
./pipe.c:pipe_poll(struct file *filp, poll_table *wait)
./pipe.c:       poll_wait(filp, &pipe->wait, wait);
./pipe.c:                * behave exactly like pipes for poll().
./pipe.c:               wake_up_interruptible_sync_poll(&pipe->wait, POLLIN | POLLOUT | POLLRDNORM | POLLWRNORM | POLLERR | POLLHUP);
./pipe.c:       .poll           = pipe_poll,
./ncpfs/sock.c:#include <linux/poll.h>
。。。 ,,,

ok, -- include 옵션 을 먼저 연 구 했 습 니 다. - exclude 를 보 세 요. 물론 -- include 와 유사 합 니 다. 검색 할 파일 을 제외 하 는 역할 을 합 니 다.
liujl@liujl-ThinkPad-Edge-E431:~/  /linux-3.10/fs$ grep "poll" . -r --exclude "README" | more
./lockd/clntlock.c:      * to lose callbacks, however, so we're going to poll from
./mount.h:#include <linux/poll.h>
./mount.h:      wait_queue_head_t poll;
./pipe.c:#include <linux/poll.h>
。。。 。。。

모든 README 파일 을 제외 합 니 다.
5) 일치 하 는 텍스트 앞 이나 뒤의 줄 을 출력 합 니 다.
파일 제어:
  -B, --before-context=NUM  텍스트 로 시작 하 는 NUM 줄 인쇄
  -A, --after-context=NUM   텍스트 로 끝 나 는 NUM 줄 인쇄
  -C, --context=NUM         출력 텍스트 NUM 줄 인쇄
liujl@liujl-ThinkPad-Edge-E431:~/  /linux-3.10/fs$ seq 10
1
2
3
4
5
6
7
8
9
10

사용 - A 옵션:
liujl@liujl-ThinkPad-Edge-E431:~/  /linux-3.10/fs$ seq 10 | grep 5 -A 3
5
6
7
8

다섯 번 째 줄 다음 세 줄 인쇄 (현재 줄, 다섯 줄 포함)
사용 - B 옵션:
liujl@liujl-ThinkPad-Edge-E431:~/  /linux-3.10/fs$ seq 10 | grep 5 -B 3
2
3
4
5

다섯 번 째 줄 이전의 세 줄 을 인쇄 합 니 다 (현재 줄 포함)
사용 - C 옵션:
liujl@liujl-ThinkPad-Edge-E431:~/  /linux-3.10/fs$ seq 10 | grep 5 -C 3
2
3
4
5
6
7
8

다섯 번 째 줄 이전의 세 줄 과 그 후의 세 줄 을 인쇄 합 니 다 (현재 줄 포함)
일치 하 는 줄 이 여러 개 있 으 면 "-" 를 각 일치 하 는 경계 문자 로 합 니 다.
liujl@liujl-ThinkPad-Edge-E431:~/  /linux-3.10/fs$ echo -e "a
b
c
a
b
c
" | grep a -A 1 a b -- a b

좋은 웹페이지 즐겨찾기