Grep 파일 내용 검색 - Grep pail naeyong geomsaeg

리눅스(Linux)

[리눅스] 파일 찾기(ls), 파일 내부 문자열 찾기(grep)

[리눅스] 파일 찾기(ls), 파일 내부 문자열 찾기(grep)

자꾸 까먹어서 정리해봅니다.

1. 파일 찾기(ls)

개인적으로 파일 찾기는 find보다 ls가 편하다고 봅니다. 확장자가 xml인 파일을 모두 찾겠습니다. 아래와 같이 씁니다.

ls -al | grep '.*[.]xml'

또는

ls -al | grep '.*\.xml'

만약 하위 모든 폴더를 대상으로 찾고 싶다면 옵션에 대문자 R를 추가합니다. Recursive의 약자입니다.

ls -alR | grep '.*[.]xml'

또는

ls -alR | grep '.*\.xml'

만약 하위 폴더 중에 'log'폴더를 찾고 싶다면, 문자열 log로 끝나는(정규식의 $) 파일 리스트를 출력해보면 되겠습니다.

ls -alR | grep 'log$'

2. 파일 내부 문자열 찾기(grep)

파일 내부의 문자열을 검색합니다. 내부에 encoding이라는 문자열이 포함된 xml 파일을 모두 찾겠습니다. 아래와 같이 씁니다. (grep 찾는내용 찾을위치)

grep 'encoding' ./*.xml 

만약 하위 모든 폴더를 대상으로 찾고 싶다면 옵션에 소문자 r을 부여합니다.

grep -r 'encoding' ./*.xml

아래와 같이 쓰면 하위 모든 디렉토리의 모든 파일들 대상으로 특정 문자열을 찾습니다.

grep -r '찾는문자열' ./*

1. find : 하위 폴더에 존재하는 파일을 찾아주는 명령어

find [검색 디렉토리] [옵션] [파일명]

옵션 의미
-name 대소문자 구분하여 파일명 검색
-iname 대소문자 구분하지 않고 파일명 검색

ex)

      find . -name FTPFILES

      find ./ftp -iname ftpfiles

ex2) root 경로의 파일 중 size가 5M 이상이고 파일의 상태가 변한지 5일 이상된 것을 찾는다. (s,m,h,d,w 를 단위로 구분. 초,분,시,일,주를 나타냄)     

     find / -type f -size +5M -mtime +5d

ex3) 위의 예시를 응용. {}: find를 통해 나온 결과를 의미하는 변수. \; : 정상적으로 모든 exec 실행이 끝이 났다는 것을 find에게 알려줌

     find / -type f -size +5M -mtime +5d -exec ls -l {} \; (출력을 ls 형태로 출력)

     find / -type f -size +5M -mtime +5d -exec rm -rf {} \; (삭제하는 명령

2. grep : 하위 폴더를 포함하여 존재하는 모든 파일에서 원하는 단어를 찾아주는 명령어. 해당 단어를 포함하고 있는 모든 행을 출력한다.

grep [옵션] [패턴(단어)] [파일명]

*단어 내에 공백이 있을 경우에는 " "를 사용

옵션 의미
-r 하위 디렉토리까지 검색
-i 비교시 대소문자 구분 안함
-l 패턴이 포함된 파일의 이름 출력
-v 패턴과 일치하지 않는 행만 출력
-c 패턴이 일치하는 행의 수 출력
-w 패턴이 전체 단어와 일치하는 행만 출력
-n 행의 번호를 함께 출력

+ A2, B2 옵션으로 해당 패턴의 아래 위 2줄씩 출력되게 하는 옵션도 존재

ex)  grep -rni ftpfiles *

ex2) grep -i ftpfiles * --color=auto (특정 패턴에 색상을 입혀 출력하기)

*find&grep 동시 사용 (파일이 아닌 표준입력을 활용하여 특정 파일에서 특정 패턴 찾기)

ex) find ./ -iname "*.sh" | xargs grep -i ftpfiles

리눅스 find 명령어는 로그파일이나, 텍스트 파일에서 특정 문자열을 찾을 때 사용하며 tail 명령어나 find 명령어등 다양한 명령어들과 함께 사용하여 로그 파일에서 실시간으로 특정 문자열을 찾는다던지, 혹은 디렉터리 내에서 특정 이름을 포함하는 파일을 찾을 때 등등 다양하게 응용도 가능합니다.

grep 명령어
리눅스에서 grep 명령어는 특정 파일에서 지정한 문자열이나 정규표현식을 포함한 행을 출력해주는 명령어입니다. 특히 tail이나 ls 등 다양한 명령어와 조합하여 응용되는 경우가 많아서 이 grep명령어는 리눅스에서 능숙하게 사용할 줄 알아야 하는 기본 명령어입니다.

 리눅스 grep 사용법 

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

문자열로 찾기

# 특정 파일에서 'error' 문자열 찾기
grep 'error' 파일명

# 여러개의 파일에서 'error' 문자열 찾기
grep 'error' 파일명1 파일명2

# 현재 디렉토리내에 있는 모든 파일에서 'error' 문자열 찾기
grep 'error' *

# 특정 확장자를 가진 모든 파일에서 'error' 문자열 찾기
grep 'error' *.log

grep명령어를 사용하시면 특정 파일에서 내가 원하는 문자열이 있는 라인을 찾을 수 있습니다. 파일은 여러개 지정도 가능합니다. 위와 같이 사용한다면 'error'라는 문자열을 mylog.log라는 파일에서 찾을 수 있겠습니다.

정규표현식으로 찾기

# 특정 파일에서 문자열이 포함된 행을 찾는다.
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] 파일명

리눅스에서 grep은 정규표현식으로 특정 문자열을 찾을 수 있는 기능도 제공합니다. 은근히 응용할곳도 많고 자주 사용되니 알아두시면 좋습니다. 

자주 사용하는 옵션

  • -c : 일치하는 행의 수를 출력한다.
  • -i : 대소문자를 구별하지 않는다.
  • -v : 일치하지 않는 행만 출력한다.
  • -n : 포함된 행의 번호를 함께 출력한다.
  • -l : 패턴이 포함된 파일의 이름을 출력한다.
  • -w : 단어와 일치하는 행만 출력한다.
  • -x : 라인과 일치하는 행만 출력한다.
  • -r : 하위 디렉토리를 포함한 모든 파일에서 검색한다.
  • -m 숫자 : 최대로 표시될 수 있는 결과를 제한한다.
  • -E : 찾을 패턴을 정규 표현식으로 찾는다.
  • -F : 찾을 패턴을 문자열로 찾는다.

grep의 종류

명령어 설명 정규표현식 사용
grep 다중 패턴을 검색한다. O
egrep 정규 표현식 패턴으로 검색한다. O
fgrep 문자열 패턴으로 검색한다. X

grep은 3가지 종류가 있습니다. egrp은 정규표현식만으로 검색하는 것이고, fgrep은 문자열로 검색하는 grep을 말하며 각각 grep의 -E, -F 옵션을 사용했을 때와 결과는 같습니다.

실시간 로그 보기 (tail + grep)

tail -f mylog.log | grep 192.168.15.86

grep은 다른 명령어와 조합해서 사용하는 경우도 많습니다. 대부분 개발자들이 실시간 로그 체크를 할 때는 tail과 grep 명령어 조합으로 로그파일에서 자신이 원하는 키워드만 추출하고는 합니다. 위의 명령어대로 사용하시면 mylog파일을 실시간으로 액세스하고 IP주소가 192.168.49.16인 행만 추출할 수 있겠습니다.

특정 파일에서 여러개 문자열 찾기

cat mylog.txt | grep 'Apple' | grep 'Banana'

| 파이프를 사용하면 grep명령어를 여러 개 사용하여 특정 파일에서 여러 개의 문자열을 찾을 수 있을 수도 있습니다. 위의 명령어대로 입력한다면 mylog.txt 파일에서 Apple과 Banana이 있는 문자열들을 찾을 수 있겠습니다.

grep 한 결과 값 txt 파일로 저장하기

grep -n 'Apple' mylog.txt > result.txt

grep한 결과가 길면 터미널에서 확인이 어렵기 때문에 txt파일로 저장하여 확인하고는 합니다. 위의 명령어대로 입력한다면 mylog.txt 파일에서 Apple이 있는 문자열들을 result.txt 파일에 저장하실 수 있습니다.