[RHEL6] 파일 찾기 명령어(egrep, find, grep, locate, strings)
본문 바로가기
IT 이야기/Linux 명령어

[RHEL6] 파일 찾기 명령어(egrep, find, grep, locate, strings)

by 찬찬이 아빠 2020. 4. 2.
반응형
  1. egrep(문자열 검색)

 1) 경로 : /bin/egrep

 2) 요약 : 파일 내의 문자열을 지정한 패턴으로 추출

 3) 사용 방법 : egrep [옵션] [패턴] 파일

 4) 옵션

 -A num, --after-context=num : 일치하는 줄 다음에 지정한 줄 수 (num)만큼의 내용을 더 보여줌

 -b, --byte-offset : 일치하는 줄을 출력하는 내용의 맨 아페 바이트 오프셋(byte offset)을 보여줌

 -B num, --before-context=num : 일치하는 줄의 위에 지정한 줄 수 만큼의 내용을 더 보여줌

 -c, --count : 일치하는 줄의 수를 보여줌

 -C[num], --before-context=num : 일치하는 줄의 위와 아래에 지정한 줄 수만큼의 내용을 더 보여줌. 기본값은 두 줄

 -d action, --directories=action : 읽고자 지정한 파일이 디렉터리일 경우 지정한 값을 실행. 기본값은 read. 아래는 실행 가능한 값

   § read : 디렉터리를 보통 파일처럼 읽음

   § skip : 디렉터리를 건너뜀

   § recurse : 디렉터리를 포함하여 하위 디렉터리의 모든 파일을 읽음

 -e pattern, --regexp=pattern : 하나 이상의 탐색 패턴을 지정. 단순한 패턴으로 동작하지만 패턴이 -로 시작할 때 유용

 -f file, --file=file : 패턴을 지정한 파일에서 가져옴

 -h, --no-filename : 패턴의 결과 목록만 보여주고 지정한 파일명은 출력하지 않음

 -i, --ignore-case : 대소문자의 구별을 하지 않음

 -l(엘), --file-with-matches : 일치하는 줄의 파일명만 보여주고, 줄의 내용은 출력하지 않음

 -n, --line-number : 일치하는 줄의 내용과 해당 줄의 위치를 출력

 -q, --quiet, --slient : 결과를 출력하지 않음

 -r, --recursive : 각 디렉터리의 하위에 존재하는 파일들을 읽음. -d recurse 옵션과 같음

 -s, --no-message : 존재하지 않거나 읽을 수 없는 파일의 결과로 에러를 출력하지 않음

 -v, --revert-match : 지정한 패턴과 일치하지 않는 내용을 보여줌

 -w, --word-regexp : 지정한 패턴과 워드 단위로 일치하는 결과만을 보여줌

 -x, --line-regexp : 패턴과 일치하는 전체 줄 수를 보여줌

 -y : -i 옵션과 같음

 

 5) 추가 설명

egrep 명령어는 정규 표현식으로 작성한 검색어를 파일 내에서 검색합니다. 이는 ₩(, ₩), ₩n, ₩<, ₩>, ₩{, ₩} 형식의 정규 표현식은 지원하지 않고 확장된 +, ?, |, () 형식만 지원합니다. 또한 정규 표현식은 따옴표로 묶어야만 합니다. 만일 실행 결과가 0이라면 하나라도 검색된 것이고, 1이면 검색된 내용이 없으며 2라면 오류가 발생했음을 나타냅니다.

 

아래 예제는 egrep으로 testfile 파일에서 Chan와 chan을 포함한 문자열을 모두 출력하라는 요청을 보낸 결과입니다.

# echo -e "chan\nChan\n www.chan.co.kr" >testfile
# cat testfile
chan
Chan
www.chan.co.kr

# egrep '(Chan|chan)' testfile
Chan
www.chan.co.kr

 

 

 

  2. find(파일 찾기)

 1) 경로 : 내부 명령어

 2) 요약 : 주어진 조건을 검색하여 파일을 찾음

 3) 사용 방법 : find [패스] [옵션] [작업]

 4) 옵션

 -name NAME : 지정된 이름(NAME)의 파일을 찾음

 -user NAME : user 소유의 파일을 찾음

 -type [bcdfls] : 지정된 형식의 파일을 찾음

  § b : 블록 파일

  § c : 문자

  § d : 디렉터리

  § f : 파일

  § l : 링크 파일

  § s : 소켓

 

 - size [+/-]n[bckw] : 지정된 크기의 파일을 찾음

  § +n : n보다 큼

  § -n : n보다 작음

  § n : n임

  § b : 512-byte

  § c : byte

  § k : kilo bytes

  § w : 2-byte

 

 -inum NUMBER : 지정한 아이노드 번호(NUMBER)와 파일을 찾음

 -print : 표준 출력으로 검색된 파일명을 출력

 -exec command{ } ₩; : 찾은 각 파일에 대해 지정된 명령을 실행

 -ok command { } ₩; : 실행 여부를 사용자에게 확인한 후 명령을 실행

 

 5) 추가 설명

find 명령어는 주어진 조건에 따라 디렉터리를 검색해서 원하는 파일을 찾는 명령어입니다. 실제로 find는 단순한 파일 검색 기능보다 다양하고, 강력한 기능을 사용자에게 제공합니다. 이때 지정한 조건식에 일치하는 파일을 -exec 명령어 형식으로 실행합니다.

 

먼저 파일 이름을 검색하는 find 사용법을 알아보고 명령행을 이용한 find 사용법을 알아봅시다. find는 먼저 검색할 경로를 정의하고, 추가적으로 옵션과 검색 키워드를 사용합니다. root 디렉터리에서 word.awk를 검색해 봅니다. 이름을 기준으로 검색할 경우 -name 옵션을 사용해야 합니다.

# find /root -name word.awk
/root/word.awk

 

find 명령어로 찾은 결과값을 또 다른 명령어를 사용하여 처리할 수 있습니다. exec "command ₩;"는 find가 찾아낸 각각의 파일에 대해 해당 명령을 실행합니다. 명령은 "₩;"로 끝나야 합니다.

<현재 디렉터리에 있는 모든 파일명 나열하기>
# find . -print

<현재 디렉터리에 있는디렉터리 나열하기>
# find . -type d -print

<현재 디렉터리에서 파일 이름에 공백 문자가 들어간 모든 파일을 삭제하기>
# find . -name "* *" -exec rm -f {} \;

<현재 디렉터리 파일 중 파일명에 비정상적인 글자를 포함한 파일 지우기>
# for filename in *
> do
> badname='echo "$filename" | sed -n >/[\+\{\;"\\\=\?~\(\)\<\>\&\*\|\$]/p'
> rm $badname 2>dev/null
> done

<검색된 파일시스템 모두 복사하기>
# mkdir /hdc1
# mount /dev/hdc1 /hdc1
# cd /home
# find . -depth -print l cpio -pmdvl /hdc1

<지난 24시간 동안 변경된 디렉터리 목록을 changelist 파일로 만들기>
# find \ -mtime -1 \! -type d -print > changelist

<시스템에서 최근 5분간 변경된 모든 파일을 목록으로 만들기>
# find \ -mmin -5 -print > changelist

<rm 명령으로 지워지지 않는 파일을 find 명령으로 inode를 지정하여 삭제하기>
# ls -i
858752 test.log

# find . -inum 858752 -exec rm -rf {} \;

 

 

 

  3. grep(문자열 검색)

 1) 경로 : /usr/bin/pathchk

 2) 요약 : 파일 이름이 유효하거나 이식성이 있는지 체크

 3) 사용 방법 : pathchk [옵션] 파일이름

 4) 옵션

 -A num, --after-context=num : 일치하는 줄 다음에 지정한 줄 수 (num)만큼의 내용을 더 보여줌

 -b, --byte-offset : 일치하는 줄을 출력하는 내용의 맨 아페 바이트 오프셋(byte offset)을 보여줌

 -B num, --before-context=num : 일치하는 줄의 위에 지정한 줄 수 만큼의 내용을 더 보여줌

 -c, --count : 일치하는 줄의 수를 보여줌

 -C[num], --before-context=num : 일치하는 줄의 위와 아래에 지정한 줄 수만큼의 내용을 더 보여줌. 기본값은 두 줄

 -d action, --directories=action : 읽고자 지정한 파일이 디렉터리일 경우 지정한 값을 실행. 기본값은 read. 아래는 실행 가능한 값

  § read : 디렉터리를 보통 파일처럼 읽음

  § skip : 디렉터리를 건너뜀

  § recurse : 디렉터리를 포함하여 하위 디렉터리의 모든 파일을 읽음

 -e pattern, --regexp=pattern : 하나 이상의 탐색 패턴을 지정. 단순한 패턴으로 동작하지만 패턴이 -로 시작할 때 유용

 -f file, --file=file : 패턴을 지정한 파일에서 가져옴

 -h, --no-filename : 패턴의 결과 목록만 보여주고 지정한 파일명은 출력하지 않음

 -i, --ignore-case : 대소문자의 구별을 하지 않음

 -l(엘), --file-with-matches : 일치하는 줄의 파일명만 보여주고, 줄의 내용은 출력하지 않음

 -n, --line-number : 일치하는 줄의 내용과 해당 줄의 위치를 출력

 -q, --quiet, --slient : 결과를 출력하지 않음

 -r, --recursive : 각 디렉터리의 하위에 존재하는 파일들을 읽음. -d recurse 옵션과 같음

 -s, --no-message : 존재하지 않거나 읽을 수 없는 파일의 결과로 에러를 출력하지 않음

 -v, --revert-match : 지정한 패턴과 일치하지 않는 내용을 보여줌

 -w, --word-regexp : 지정한 패턴과 워드 단위로 일치하는 결과만을 보여줌

 -x, --line-regexp : 패턴과 일치하는 전체 줄 수를 보여줌

 -y : -i 옵션과 같음

 

 5) 추가 설명

grep 명령어는 지정한 특정 문자열을 검색하여 동일한 문자열이 있는 줄의 패턴을 찾아 화면에 출력합니다. grep와 비슷한 기능의 명령어로 egrep, fgrep, rgrep, agrep이 있습니다.

아래 예제는 현재 디렉터리에서 하위 디렉터리까지 모두 검색하고(-r), 대소문자를 구분하지 않고(-i), 검색 키워드를 갖는 파일들을 보여줍니다. 이 때 에러는 출력하지 않습니다(-s).

# grep -irls "gnome" *
gconf-2.0.pc
gconf-sharp-peditors-2.0.pc
gnome-keyring-sharp-1.0.pc
gnome-keyring-sharp.pc
gnome-panel-sharp-2.24.pc
gnome-panel-sharp.pc
gnome-screensaver.pc
gnome-sharp-2.0.pc
gnome-sharp-2.24.pc
gnome-system-tools.pc
gnome-vfs-sharp-2.0.pc
gtk-sharp-2.0.pc
notify-python.pc

 

 

 

  4. locate(파일 위치 찾기)

 1) 경로 : /usr/bin/locate

 2) 요약 : 지식 데이터베이스로 파일을 찾음

 3) 사용 방법 : locate [옵션] [패턴]

 4) 옵션

 -b, --basename : 패턴(키워드)을 포함한 파일 또는 디렉터리만을 검색하여 출력. 이 옵션을 사용하지 않으면 검색된 디렉터리의 하위 디렉터리와 파일까지 모두 출력

 -c, --count : 검색된 결과의 수를 출력

 -d, --database DBPATH : 검색한 데이터베이스(DBPATH)를 지정

 -e, --existing : 검색한 시점에 존재하는 파일만 출력. DB 생성 시점과 검색 시점의 시간차에 의해 실제 존재하지 않는 파일이 검색되는 것을 방지

 -h, --help : 사용법을 출력

 -S, --statistics : 모아 놓은 DB의 통계를 출력

 -r, --regexp : 기본 정규 표현식을 이용한 검색을 지원

 --regex : 확장 정규 표현식을 이용한 검색을 지원

 -V, --version : 버전 정보 출력

 

 5) 추가 설명

locate 명령어는 모든 파일과 디렉터리의 위치 정보를 DB로 생성하여 사용자 키워드를 생성하고, 파일이나 디렉터리의 위치를 출력합니다.

 

예전에는 Secure locate인 slocate 명령어를 쓰다가, 현재는 DB 생성 속도가 크게 개선된 mlocate 명령어를 주로 씁니다. locate를 사용하기 위해서는 우선 updatedb 명령어를 이용하여 DB를 생성해야 합니다.

# updatedb

 

생성된 DB의 정보를 확인해 봅니다.

# locate -S
Database /var/lib/mlocate/mlocate.db:
	17,294 directories
    218,387 files
    10,472,698 bytes in file names
    4,407,912 bytes used to store database

 

DB를 통해 키워드를 검색하기 때문에 최소한 하루에 한 번씩 DB를 업데이트 합니다. 아래와 같이 updatedb 명령어를 자동으로 하루에 한 번씩 실행하도록 cron에 등록할 수 있습니다.

# cat /etc/cron.daily/mlocate.cron
#!/bin/sh
nodevs=$(< /proc/filesystems awk '$1 == "nodev" { print $2 }')
renice +19 -p $$ >/dev/nul 2>&1

 

locate는 DB를 사용하므로 find에 비해 훨씬 속도가 빠릅니다. 아래처럼 locate로 httpd.conf르르 검색해 봅니다. -e 옵션은 검색한 시점에 파일이 존재하는지 확인 후 결과를 출력합니다. 이는 DB 생성과 검색 시점의 시간차로 인해 발생할 수 있는 잘못된 정보를 막을 수 있습니다.

# locate -e httpd.conf
/etc/httpd/conf/httpd.conf
/usr/share/system-config-httpd/httpd.conf.xsl

 

 

  5. strings(문자열 찾기)

 1) 경로 : /usr/bin/strings

 2) 요약 : 파일에서 인쇄 가능한 문자열을 출력

 3) 사용 방법 : strings [옵션] 파일

 4) 옵션

 -, -a, --all : 전체 파일을 검색

 -f, --print-file-name : 각 문자열 이전에 파일명을 출력

 -min-len, -n min-len, --bytes=min-len : 최소 문자열의 길이(min-len)를 지정. 기본값은 4

 -o(오) : -t 옵션과 같음

 -t radix, --radix=radix : 각 문자열 이전에 파일 안에 오프셋(radix)을 출력

  § d : 오프셋을 10진수로 기록

  § o(오) : 오프셋을 8진수로 기록

  § x : 오프셋을 16진수로 기록

 

 -t-target=format : 시스템의 기본 코드 포맷(format)을 지정

 -v, --version : 버전 정보 출력

 

 5) 추가 설명

strings 명령어는 오브젝트 또는 이진 파일에서 인쇄 가능한 문자열을 출력합니다. 최소 문자열의 길이는 4입니다. 먼저 cat 명령어로 hello.c 원본 파일을 살펴봅니다.

# cat hello.c
#include <stdio.h>
main()
{
	printf ("test");
}

 

아래와 같이 strings 명령어는 hello.c 파일에서 네 글자 이상의 문자열만을 검색하여 출력합니다.

# strings hello.c
#include <stdio.h>
main()
printf ("test");

 

아래와 같이 지정한 문자열을 기준으로 내용을 출력할 수 있습니다. 지정한 옵션 -17은 최소 문자열로 17자 이상의 문자열만을 출력합니다. 이 옵션은 -n 17 또는 --bytes=17로도 지정할 수 있습니다.

# strings -17 hello.c
#include <stdio.h>
반응형

댓글