Grep
grep(그랩)은 Unix를 위해 만들어진 텍스트 검색 기능을 가진 명령어이다. 그 이름은 Unix ed 의 명령어로 비슷한 기능을 수행하는 g/re/p에서 유래되었다.
grep은 엄밀히 말하면 두문자어(머리글자로 된 말)은 아니지만 Global / Regular Expression / Print 에서 각각의 머릿글자를 따 온 것이며 이것은 ed 텍스트 편집기에서 쓰이는 연속적인 지시어이다.
grep 명령어는 파일이나 표준 입력을 검색하여 주어진 정규표현식과 맞는 줄을 찾아 프로그램의 표준 출력으로 출력한다.
Options
-
-c
: 패턴이 일치하는 행의 수를 출력. -
-n
: 행번호를 함께 출력한다. -
-i
: 대소문자를 구별하지 않는다. -
-v
: 검색된 내용이 존재하지 않는 행을 출력한다. (이 옵션은 입력 파일에서 특정 내용의 입력을 삭제하는데 쓰인다.) -
-l
: 패턴이 찾아진 파일의 행 번호 대신 단지 파일이름만 출력한다. -
-w
: 패턴이 다른 단어의 일부가 아닌 하나의 단어가 되는 경우만 찾는다. (northwest나 northeast 등의 단어가 아니라, north라는 단어가 포함된 행만 출력한다.) -
""
: 큰따옴표로 둘러싸여 있는 경우 쉘변수로 치환한다. -
-I
: (대문자 i) 바이너리 파일을 검색에서 제외한다.binary-files=without-match
옵션과 동일하다. -
-A10
: 검색된 패턴에서 다음 10줄을 추가로 출력한다. 1 -
-B10
: 검색된 패턴에서 이전 10줄을 추가로 출력한다.
Pattern Syntax
-
-E
,--extended-regexp
- Interpret PATTERNS as extended regular expressions (EREs).
-
-F
,--fixed-strings
- Interpret PATTERNS as fixed strings, not regular expressions.
-
-G
,--basic-regexp
- Interpret PATTERNS as basic regular expressions (BREs). This is the default.
-
-P
,--perl-regexp
- Interpret PATTERNS as Perl-compatible regular expressions (PCREs).
- This option is experimental when combined with the
-z
(--null-data
) option, and grep-P
may warn of unimplemented features.
사용예제
-
grep NW d*
: d로 시작하는 모든 파일에서 NW를 포함하는 모든 행을 찾는다. -
grep '^n' [FILE]
: n으로 시작하는 모든 행을 출력한다. -
grep '4$' [FILE]
: 4로 끝나는 모든 행을 출력한다. -
grep '.5' [FILE]
: .5가 나오는 모든 행을 출력한다. -
grep '^[we]' [FILE]
: w나 e로 시작하는 모든 행을 출력한다. -
grep '[^0-9]' [FILE]
: 숫자가 아닌 문자를 하나라도 포함하는 모든 행을 출력한다. -
grep '[A-Z][A-Z] [A-Z]' [FILE]
: 대문자 2개와 공백 1개, 그리고 대문자 하나가 연이어 나오는 문자열이 포함된 행을 출력한다. -
grep 'ss* ' [FILE]
: s가 한 번 나오고, 다시 s가 0번 또는 여러번 나온 후에 공백이 연이어 등장하는 문자열을 포함한 모든 행을 출력한다. -
grep '[a-z]{9}' [FILE]
: 소문자가 9번 이상 반복되는 문자열을 포함하는 모든 행을 출력한다. -
grep '<[a-z].*n>' [FILE]
: 소문자 하나로 시작하고, 이어서 임의 개수의 여러 문자가 나오며, n으로 끝나는 단어가 포함된 모든 행을 출력한다 (여기서 .*는 공백을 포함한 임의의 문자들을 의미한다) -
grep -i "$LOGNAME" [FILE]
: 환경변수인 LOGNAME의 값을 가진 모든 행을 출력한다. -
grep -r "string" ./*
: string이 포함된 파일을 전부 찾는다.
grep "com.androidclient" src -r | grep -v .svn
: src 디렉터리 안에서, "com.androidclient"문자열이 들어간 모든 파일 중, 파일이름에 .svn이 없는 파일을 찾는다. regex를 사용하지 않고 완벽히 일치하는지 확인하는 방법은?
전체 줄이 일치하는 경우에만 grep을 일치시키는 방법은 무엇입니까?
From the grep man page:
-
-F
,--fixed-strings
- Interpret PATTERN as a (list of) fixed strings
-
-x
,--line-regexp
- Select only those matches that exactly match the whole line.
단어 부정
"21" 이 아닌 단어를 찾을 경우:
여러 줄에 걸쳐 검색 결과를 도출할 경우
복잡하니 예제로서 설명하자면...
다음과 같은 내용을 있을 때,
2023-12-22 14:04:44.576 1/140201166767936 ddrm.plc INFO Recv 2+100 bytes: b'{"lifecount":22308,"plateno":3718,"fronttemp":1,"reartemp":800,"passno":19,"camera":1,"event":"end"}'
2023-12-22 14:04:45.246 1/140201166767936 ddrm.plc INFO Send 2+76 bytes: b'{"type":"camber","event":"real","camera":1,"error":0,"data":{"value":-2336}}'
2023-12-22 14:04:45.246 1/140201166767936 ddrm.plc DEBUG on_recv_end(camera=1,lifecount=22308,passno=19,plateno=3718,fronttemp=1,reartemp=800)
2023-12-22 14:04:45.246 1/140201166767936 ddrm.cam1 INFO on_end(lifecount=22308,passno=19,plateno=3718,fronttemp=1,reartemp=800)
2023-12-22 14:04:45.246 1/140201166767936 ddrm.plc INFO Send 2+160 bytes: b'{"type":"camber","event":"event","camera":1,"error":0,"lifecount":22308,"data":{"cambers":[-21],"avg":-95,"min":-168,"max":-21}}'
2023-12-22 14:04:46.733 1/140201166767936 ddrm.plc INFO Send 2+74 bytes: b'{"type":"camber","event":"real","camera":1,"error":0,"data":{"value":216}}'
ddrm.plc
중 fronttemp=1
인 다음줄에 cambers
배열의 첫 값이 21
이 아닐 경우 plateno
값을 찾고싶다면:
-A1
와 -B1
옵션을 섞어 쓰면 된다:
cat cam1 \
| grep -v ddrm.cam1 \
| grep -A1 fronttemp=1 \
| grep -B1 -E '"cambers":\[([^2][^1])' \
| grep 'plateno='
여러 줄의 결과를 합치는 방법
다음의 도구를 사용하는 방법이 있다:
-A
또는 -B
를 사용할 경우 분할 위치에 --
가 추가되므로 다음과 같이 사용하면 된다:
Lookaround 문법 사용 방법
-P
플래그로 Perl호환 표현식을 사용해야 한다.
간단한 예제로:
Color output
grep is capable of color-highlighting the matched string in its output. But, by default, that option is turned off. There are 3 color options available to you:
-
--color=auto
-
--color=always
-
--color=never
Lastly, you can specify the color parameter in a grep-specific environment variable. Then, you don't have to enter it in the command line.
비슷한 명령어
현존하는 많은 운영 체제를 위해 grep명령어는 수많은 보충 기능과 파생 기능을 가지고 있다. grep의 초기 변형어로는 egrep 과 fgrep이 있었다. 전자는 Ken Thompson의 original regular expression implementation이후에 이루어진 확장된 regular expression syntax 기능을 제공하였다. 후자는 Aho-Corasick algorithm 을 사용하여 고정된 string의 리스트를 검색하는 기능을 가지고 있었다. 이와 같은 변형들은 최근의 grep 명령어 보완에 포함되어 대부분이 옵션 기능으로 바뀌었다. 이와 같은 통합 보완 체제 하에서는 grep은 사용되는 이름에 따라 서로 다른 기능을 수행할 수도 있으나, egrep, fgrep 그리고 grep은 모두 같은 프로그램으로 연결되는 명령어로 기능한다.
Tcgrep은 grep의 보완된 형태로 Perl언어를 사용한다. 'grep'이라는 단어를 포함하는 다른 명령들은 그들이 검색 기능을 갖는다는 의미를 내포하고 있다. 예를 들어 pgrep 기능은 주어진 regular expression에 일치하는 이름을 가진 프로세스들의 목록을 보여 준다.
Perl에서 grep은 목록에 존재하는 요소를 검색하는 내장 기능이다. 기술적 프로그래밍 언어에서 이와 같은 기능은 보통 'filter'라고 이름붙여져 있다.
DOS, OS/2, 그리고 Microsoft Windows 기반의 시스템은 간단한 검색 기능을 가진 명령어를 제공한다. Windows에는 findstr이라는 명령어가 있는데 이 명령어는 "grep"과 기능적 측면에서 매우 유사하며 혹은 윈도에서도 cygwin을 이용하여 grep의 변형된 버전을 이용할 수 있다. typically named "filter" instead.
- grep : 파일 전체를 뒤져 정규표현식에 대응하는 모든 행들을 출력한다.
- egrep : 'Extended grep'으로 불리며 grep의 확장판으로 추가 정규표현식 메타문자들을 지원한다. grep과 동일한 명령행 옵션을 지원한다.
- fgrep : fixed grep 이나 fast grep으로 불리며, 모든 문자를 문자 그래도 취급한다. 즉, 정규표현식의 메타문자도 일반 문자로 취급한다.
egrep example
-
egrep 'NW|EA' [FILE]
- NW나 EA가 포함된 행을 출력하는 예제. -
egrep '3+' [FILE]
- 숫자 3이 한 번 이상 등장하는 행을 출력하는 예제. -
egrep '2.?[0-9]' [FILE]
- 숫자 2 다음에 마침표가 없거나 한 번 나오고, 다시 숫자가 오는 행을 출력하는 예제. -
egrep ' (no)+' [FILE]
- 패턴 no가 한 번 이상 연속해서 나오는 행을 출력하는 예제. -
egrep 'S(h|u)' [FILE]
- 문자 S 다음에 h나 u가 나오는 행을 출력하는 예제. -
egrep 'Sh|u' [FILE]
- 패턴 Sh나 u를 포함한 행을 출력하는 예제.
관련 텍스트 편집 유틸리티
- grep: 패턴 검색을 위한 유틸리티.
- awk: 특정 패턴의 문자들을 원하는 포맷으로 변경할 수 있는 유리리티.
- sed: 'Stream EDitor'의 약자로, 파일을 열지 않고 데이터를 편집할 수 있는 유틸리티.
Text Processing Commands
|
See also
- ack
- Regular expression
- tr
- awk
- sed
- fgrep
- egrep
- zipgrep - zip file
- zgrep - gz file
- Krep - grep 보다 5배 빠른 문자열 검색 도구
Favorite site
- GNU grep 사용자 매뉴얼
- Wikipedia (en) grep 설명
- grep, egrep, fgrep
- [추천] 리눅스 grep 명령어 2
- [추천] grep, egrep, fgrep 명령어
- The Open Group Base Specifications Issue 7
- Linux grep 명령어 사용법
- grep, egrep, fgrep 기능 3
- egrep에 대한 설명 4