[Linux]명령어 grep으로 특정 문구 찾기
카테고리: Linux
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'
댓글 남기기