Profile picture

[Linux] grep 사용법 익히기

JaehyoJJAng2023년 06월 05일

머리말

리눅스 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'

Loading script...