머리말
리눅스 grep 명령어는 로그파일이나, 텍스트 파일에서 특정 문자열을 찾을 때 사용하며 tail 명령어나 find 명령어 등 다양한 명렁어들과 함께 사용하고 있다. 로그 파일에서 실시간으로 특정 문자열을 찾는다던지, 디렉토리 내에서 특정 이름을 포함하는 파일을 찾을 때 등등 다양하게 응용 가능하다.
grep Command
리눅스에서 grep 명령어는 특정 파일에서 지정한 문자열이나 정규표현식을 포함한 행을 출력해주는 명령어이다.
grep 사용법
grep [옵션] [패턴] [파일명]
자주 사용하는 옵션
옵션 | 설명 |
---|---|
-c | 일치하는 행의 수를 출력한다. |
-i | 대소문자를 구별하지 않는다. |
-v | 일치하지 않는 행만 출력한다. |
-n | 포함된 행의 번호를 함께 출력한다. |
-l | 패턴이 포함된 파일의 이름을 출력한다. |
-w | 단어와 일치하는 행만 출력한다. |
-x | 라인과 일치하는 행만 출력한다. |
-r | 하위 디렉토리를 포함한 모든 파일에서 검색한다. |
-m | 최대로 표시될 수 있는 결과를 제한한다. |
-E | 찾을 패턴을 정규 표현식으로 찾는다. |
-F | 찾을 패턴을 문자열로 찾는다. |
예제 응용
1. 문자열로 찾기
# 특정 파일에서 'hello' 문자열 찾기
grep 'hello' 파일명
# 여러개의 파일에서 'hello' 문자열 찾기
grep 'hello' 파일명1 파일명2
# 현재 디렉토리내에 있는 모든 파일에서 'hello' 문자열 찾기
grep 'hello' ./*
# 특정 확장자를 가진 모든 파일에서 'hello' 문자열 찾기
grep 'hello' *.txt
2. 정규표현식으로 찾기
# 특정 파일에서 문자열이 포함된 행을 찾는다.
grep '^[ab]' 파일명
# 특정 파일에서 a로 시작하는 모든 단어를 찾는다.
grep 'a*' 파일명
# 특정 파일에서 a로 시작하고 z로 끝나는 5자리 단어를 찾는다.
grep 'a...z' 파일명
# 특정 파일에서 a,b,c로 시작하는 단어를 모두 찾는다.
grep [a-c] 파일명
# 특정 파일에서 apple 또는 Apple로 시작하는 단어를 모두 찾는다.
grep [aA]pple 파일명
# 특정 파일에서 a나 b로 시작되는 모든 행을 찾는다.
grep '^[ab]' 파일명
# 특정 파일에서 apple로 시작되고 0나 9의 숫자로 끝나로 시작되는 모든 행을 찾는다.
grep 'apple'[0-9] 파일명
3. -A 옵션
-A5
: 일치하는 패턴 다음에 나오는 5줄까지의 텍스트를 출력하는 옵션
kubectl describe pod/pod-readiness-exec1 | grep -A5 'Conditions'
Conditions:
Type Status
Initialized True
Ready True
ContainersReady True
PodScheduled True
4. 실시간 로그 보기
tail -f error.log | grep '192.168.56.101'
위의 명령어를 사용하면 error.log 파일을 실시간으로 액세스하고 IP 주소가 192.168.56.101인 행만 추출할 수 있다.
5. 최대 검색 결과 제한
$ grep -m 100 '192.168.56.101' error.log
grep한 결과가 너무 많은 경우 스크롤이 내려가는 경우가 생기기 때문에 grep 출력 결과를 제한하고 싶다면 -m
옵션을 사용하면 된다.
위의 예제에서는 192.168.56.101에 해당하는 행을 100개까지만 찾는다.
6. 여러 조건 필터링 걸기
rpcinfo -p
명령을 사용하여 출력된 결과에서 'status', 'mountd', 'nfs' 라는 스트링이 있는 행만 필터링 해보자.
rpcinfo -p | grep -E 'status|mountd|nfs'
100024 1 udp 49733 status
100024 1 tcp 46677 status
100005 1 udp 20048 mountd
100005 1 tcp 20048 mountd
100005 2 udp 20048 mountd
100005 2 tcp 20048 mountd
100005 3 udp 20048 mountd
100005 3 tcp 20048 mountd
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
100227 3 tcp 2049 nfs_acl
grep -E
: 확장된 정규 표현식을 사용하겠다는 의미.grep -E 'status|mountd|nfs|
: 'stats', 'mountd', 'nfs' 중 하나라도 포함된 행을 출력함.
만약 정확히 'status', 'mountd', 'nfs' 단어로만 일치하는 행을 출력하려면 다음과 같이 단어 경계를 지정하여 검색하면 된다.
rpcinfo -p | grep -wE 'status|mountd|nfs'