솔솔

[Linux] grep과 정규 표현식 본문

나의보물들/Linux

[Linux] grep과 정규 표현식

솔솔하네 2024. 9. 24. 14:10
반응형

🍀 grep이란?


Linux 및 Unix 기반 시스템에서 특정 문자열이나 패턴을 파일 내에서 검색하는 명령어

 

 

🍀 grep 명령어 및 주요 옵션


명령어

grep [옵션..] [패턴] [파일..]

 

주요 옵션

grep --help # grep 옵션 확인 명령어

패턴 선택 및 해석 (Pattern selection and interpretation):

  • -E, --extended-regexp: 확장 정규 표현식을 사용하여 패턴 검색.
  • -F, --fixed-strings: 패턴을 문자열로 인식하고 검색.
  • -G, --basic-regexp: 기본 정규 표현식을 사용하여 패턴 검색.
  • -P, --perl-regexp: Perl 정규 표현식을 사용하여 패턴 검색.
  • -e, --regexp=PATTERNS: 명시한 패턴으로 검색.
  • -f, --file=FILE: 지정한 파일에서 패턴을 가져와 검색.
  • -i, --ignore-case: 대소문자를 구분하지 않고 검색.
  • -w, --word-regexp: 단어 전체가 일치하는 경우에만 검색.
  • -x, --line-regexp: 라인 전체가 일치하는 경우에만 검색.
  • -z, --null-data: 데이터 줄의 끝이 0 바이트로 처리 (null 문자 기준).

기타 옵션 (Miscellaneous):

  • -s, --no-messages: 에러 메시지를 표시하지 않음.
  • -v, --invert-match: 패턴과 일치하지 않는 줄을 출력.
  • -V, --version: 버전 정보 출력 후 종료.

출력 제어 (Output control):

  • -m, --max-count=NUM: 일치하는 줄을 NUM개까지만 출력.
  • -b, --byte-offset: 출력 줄에 바이트 오프셋(위치) 표시.
  • -n, --line-number: 일치하는 줄의 줄 번호 출력.
  • -H, --with-filename: 파일 이름을 출력에 포함.
  • -h, --no-filename: 출력에서 파일 이름 생략.
  • -o, --only-matching: 일치하는 부분만 출력.
  • -q, --quiet, --silent: 일반 출력을 억제 (에러나 상태 코드만 반환).
  • -a, --text: 이진 파일을 텍스트 파일처럼 처리.
  • -I: 이진 파일을 일치하지 않는 것으로 취급.
  • -d, --directories=ACTION: 디렉토리를 어떻게 처리할지 결정 (read, recurse, skip 중 선택).
  • -D, --devices=ACTION: 장치, FIFO, 소켓을 어떻게 처리할지 결정 (read, skip 중 선택).
  • -r, --recursive: 디렉토리를 재귀적으로 검색.
  • -R, --dereference-recursive: 심볼릭 링크를 따라 재귀적으로 검색.

 

🍀 정규 표현식


의미 내용
. 임의의 문자 하나
? 문자가 존재하거나 존재하지 않음(0, 1)
* 문자가 미 존재 또는 무한대로 존재 (0~*)
+ 문자가 한번 이상 존재(1~*)
^ 기호 바로 뒤의 문자로 문자열이 시작
$ 기호 바로 앞으 문자로 문자열이 끝남
{숫자} 숫자 만큼 반복
{숫자,} 숫자 이상 만큼 반복
{숫자1, 숫자2} 숫자 1 이상, 숫자 2 이하 만큼 반복
{문자열} 문자나 문자열을 묶음
[문자1, 문자2, ...] 대괄호 안에 있는 문자들이 존재하는지 검색
[^ ] [] 안에 포함되지 않은 문자
[:알파벳:] 알파벳만 검색
[:알파벳숫자] 알파벳과 숫자만 검색
[:숫자:] 숫자만 검색
[:upper:] 대문자 검색

* 정규 표현식에 사용되는 문자기호를 메타문자 (metacharacters) 라고 함

 

 

🍀 grep 명령어 사용해보기 전 사전 준비


1. ' dirA' 폴더 생성

$ mkdir dirA

 

2. dirA폴더 아래에 example.txt 파일준비

$ cat >> example.txt
고객id   고객명   등급
cust01   아이유   vvip
cust02   차은우   VIP
cust03   지석진   silver

 

 

🍀 grep 명령어 사용해보기


 

문자열로 찾기

1. '아이유'가 들어가는 텍스트 찾기

$ grep '아이유' dirA/example.txt

 

 

옵션을 사용해서 문자열로 찾기

1. 'vip'가 들어가는 텍스트 찾기 

# 대소문자 구분
$ grep  'vip' dirA/example.txt

# 대소문자 구분 x
$ grep -i 'vip' dirA/example.txt

 

2. 'vip'가 들어가는 텍스트 라인 번호 찾기

$ grep -n 'vip' dirA/example.txt

 

 

정규식을 사용해서 찾기

1. 'c'로 시작하는 텍스트 찾기

$ grep c* dirA/example.txt

2. 's','v'가 들어가는 텍스트 찾기

$ grep [s,v] dirA/example.txt

특정파일에서 문자열 찾기

1. 사용자 계정 정보에서 'user11' 텍스트 찾기

$ cat /etc/passwd | grep 'user11'

 

 

🧨 트러블 슈팅


아래의 명령어로 c로시작하고 01로 끝나는 문자를 찾으려고 할때 아무것도 나오지 않는 것이였다.

grep  c.+01 dir*/*
# c: 패턴은 문자 c로 시작
# .: 임의의 한 문자
# +: 앞에 있는 문자가 하나 이상 반복
# 01: 그 뒤에 01이라는 숫자가 와야 함

 

찾아보니

 

grep의 기본 모드는 Basic Regular Expressions 방식임으로 해당 모드에서는 +는 일반 문자로 처리됨.

+를 특수문자로 사용하려면 grep을 Extended Regular Expressions  모드로 실행해야 하는데 이를 위해 -E 옵션을 추가해야 했음. ( 'grep --help' 명령어로 찾아보면 해당옵션에 대해 설명이 나와있다.)

* 즉 정규식으로 찾고 싶으면 -E 옵션을 잘 써주자!!

grep -E c.+01 dir*/*