BASH 명령 의 즐거움 (3) 의 grep
모든 파일 이나 표준 입력 에서 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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.