[Linux]명령어 grep으로 특정 문구 찾기

Date:     Updated:

카테고리:

grep 명령어

grep명령어는 로그파일이나, 텍스트파일, 혹은 코드가 작성된 파일에서 특장 문자열을 찾을 때 사용된다. 예를 들어, 내가 test.py파일에서 “Seoul”이라는 단어가 쓰인 코드라인을 알고싶을 때 사용한다. 즉, 특정 파일에서 지정한 문자열이나 정규표현식을 포함한 행을 출력해주는 명령어이다. 특히 tail이나 ls 등 다양한 명령어와 조합하여 응용되는 경우가 많아서 이 grep명령어는 리눅스에서 능숙하게 사용할 줄 아는 것이 좋다.

grep 명령어 사용법

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

예를 들어, 이전의 예시처럼 test.py파일에서 “Seoul”이라는 단어를 찾는 경우가 있다. 나아가 현재 경로 상의 모든 하위 디렉토리에 존재하는 파일에 대해 검색을 실행할 수 있다.

# 특정 파일에서 "Seoul" 문자열 찾기
grep "Seoul" test.py

# 여러 개의 파일에서 "Seoul" 문자열 찾기
grep "Seoul" test1.py test2.py

# 현재 디렉토리내에 있는 모든 파일

grep -r "Seoul" 
grep "Seoul" * 

다음과 같이 정규 표현식과 특정 패턴 검색도 가능하다.

# 특정 파일에서 c나 d로 시작되는 모든 행을 찾는다.
grep '^[cd]' 파일명 

# 특정 파일에서 b로 시작하는 모든 단어를 찾는다.
grep 'b*' 파일명 

# 특정 파일에서 b로 시작하고 y로 끝나는 7자리 단어를 찾는다.
grep 'b.....y' 파일명 

# 특정 파일에서 x, y, z로 시작하는 단어를 모두 찾는다.
grep '[x-z]' 파일명

# 특정 파일에서 orange 또는 Orange로 시작하는 단어를 모두 찾는다.
grep '[oO]range' 파일명 

# 특정 파일에서 p나 q로 시작되는 모든 행을 찾는다.
grep '^[pq]' 파일명 

# 특정 파일에서 banana로 시작되고 3이나 7로 끝나는 모든 행을 찾는다.
grep 'banana[37]' 파일명

grep명령어 옵션

  • -r 또는 --recursive
    • 지정한 디렉토리와 하위 디렉토리를 재귀적으로 검색한다.
    • 예시: grep -r "pattern" /home/meaningful96/CodeAttic
  • -v 또는 --invert-match
    • 패턴과 일치하지 않는 라인을 출력한다.
    • 예시: grep -v "pattern" /home/meaningful96/CodeAttic
  • -i 또는 --ignore-case
    • 대소문자를 구분하지 않고 검색한다.
    • 예시: grep -i "pattern" /home/meaningful96/CodeAttic
  • -n 또는 --line-number
    • 일치하는 라인의 줄 번호와 함께 출력한다.
    • 예시: grep -n "pattern" /home/meaningful96/CodeAttic
  • -H 또는 --with-filename
    • 검색 결과에 파일 이름을 포함하여 출력한다.
    • 예시: grep -H "pattern" /home/meaningful96/CodeAttic
  • -o 또는 --only-matching
    • 패턴과 일치하는 부분만 출력한다.
    • 예시: grep -o "pattern" /home/meaningful96/CodeAttic

grep 명령어를 통한 검색 후 단어 교체하기(with sed)

grep -rl '검색 단어' /경로 | xargs sed -i 's/검색 단어/교체 단어/g'

grep으로 문자열을 검색하고, 해당 문자열을 모두 다른 문자열로 교체를 할 수 있다. 이는 위의 명령어처럼 실행을 하면 된다. 특정 경로 상에서 “검색 단어”“를 찾고, 이를 “교체 단어”로 모두 대체할 수 있다. 예를 들어, 현재 디렉토리(혹은 특정 디렉토리)내의 모든 파일을 상대로 “green_apple”이라는 단어를 검색하고 이를 “red_apple”이라는 단어로 교체한다고 가정하자. 현재 경로는 리눅스에서 ./이다.

# 현재 경로에서 명령어 실행
grep -rl 'green_apple' ./ | xargs sed -i 's/green_apple/red_apple/g'

# 특정 디렉토리에서 명령어 실행
grep -rl 'green_apple' /path/to/directory | xargs sed -i 's/green_apple/red_apple/g'

Linux 카테고리 내 다른 글 보러가기

댓글 남기기