CentOS/Study

[Study29]Linux grep 및 find 명령으로 파일 검색 간소화

AnKiWoong 2023. 3. 28. 09:39
반응형

grep 명령어

grep 명령어는 특정한 패턴을 검색하여 해당 패턴을 포함하는 줄을 화면에 출력하는 명령어입니다. grep 명령어는 주로 파일 내에서 특정한 패턴을 찾기 위해 많이 사용됩니다. 찾으려는 패턴을 정규식(Globally/Regular Expression/Print)이라고 표현합니다.

grep 명령어는 다양한 옵션을 제공하는데, 파일에서 특정 패턴을 검색할 때 -l 옵션을 사용하면 파일 내에서 패턴이 있는 파일명만을 출력할 수 있습니다. 또한, -n 옵션을 사용하면 패턴을 포함하는 줄을 출력할 때 줄번호와 함께 출력할 수 있습니다. -v 옵션은 패턴을 포함하지 않는 줄을 출력할 수 있습니다. -c 옵션은 패턴을 찾은 줄의 수를 출력할 수 있습니다. -i 옵션은 패턴을 찾을 때 대소문자를 구분하지 않습니다.

또한, grep 명령어는 다양한 패턴을 제공합니다. 예를 들어, 모든 문자를 포함하는 패턴을 찾으려면 *를 사용할 수 있습니다. .은 하나의 영문자나 숫자를 치환합니다. ^는 라인의 시작이 특정한 문자열로 시작하는 라인을 검색합니다. $는 라인의 끝이 특정한 문자열로 끝나는 라인을 검색합니다. []는 괄호 안에 있는 문자 중 하나를 검색합니다.

 

[명령어 형식]

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

위 명령어는 Linux에서 파일에서 특정 문자열을 검색하는 데 사용됩니다. 그러나 이 명령어는 단순한 파일 검색에만 사용되지 않습니다. 예를 들어, '-i'나 '-v'와 같은 옵션을 조합하여 대소문자를 구분하지 않거나 패턴과 일치하지 않는 행을 출력 할 수 있습니다. 또한 여러 파일에서 검색하여 원하는 정보를 찾는 데 유용하게 사용할 수 있습니다. 이러한 검색기능을 이용하여 파일에서 유용한 정보를 빠르고 쉽게 찾아낼 수 있습니다.

 

(기본 사용법)

리눅스에서 명령어를 입력하여 특정한 검색어를 찾을 때, grep 명령어는 매우 유용하게 사용됩니다. grep 명령어는 파일 내에서 검색어를 찾아 해당하는 라인을 출력해줍니다. 위의 명령어들은 이러한 기능을 가진 grep 명령어의 사용 예시입니다.

예를 들어, grep root /etc/passwd 명령어는 /etc/passwd 파일 내에서 root이라는 검색어를 찾아 해당하는 라인을 출력합니다. 이와 같은 명령어들을 통해, 사용자는 원하는 정보를 빠르고 쉽게 찾아 낼 수 있습니다.

# grep root /etc/passwd    (# cat /etc/passwd | grep root)
# CMD | grep root
# cat /etc/passwd | grep root
# rpm -qa | grep ssh
# ps -ef | grep socket

 

(옵션 사용법) "# grep OPTIONS PATTERN file1"

# grep -l root /etc/hosts /etc/passwd /etc/group /* 여러 파일 중 검색 문자열 존재 파일 출력 */
# grep -n root /etc/group  /* -n: number line, 파일에서 root 문자열을 검색하고 라인 번호도 같이 출력 # cat -n /etc/passwd | grep root */ 
# grep -v root /etc/passwd  /* -v: inverse, 파일에서 검색 문자열을 제외하고 나머지 출력 */
# grep -i root /etc/passwd  /* -i: ignore case, 파일에서 검색 문자열의 대소문자를 구분하지 않음 */
# grep -w root file1        /* -w: word , 단어의 일부분이 아닌 단어의 전체가 일치하는 경우 출력 */
# grep --color root /etc/passwd

grep 명령어는 파일에서 원하는 문자열을 찾아 출력하는 명령어입니다. 리눅스 사용자들이 자주 사용하는 명령어 중 하나로, 텍스트 파일에서 원하는 내용을 찾고자 할 때 유용합니다.

옵션에 따라 다양한 기능을 수행할 수 있습니다. -l 옵션을 사용하면 여러 파일 중 검색 문자열이 존재하는 파일만 출력할 수 있고, -n 옵션을 사용하면 문자열을 찾은 라인 번호도 함께 출력할 수 있습니다. -v 옵션을 사용하면 검색 문자열을 제외하고 나머지를 출력하고, -i 옵션을 사용하면 검색 문자열의 대소문자를 구분하지 않습니다. -w 옵션을 사용하면 단어 전체가 일치하는 경우에만 출력하며, --color 옵션을 사용하면 출력 결과 중 검색 문자열이 색상으로 강조됩니다.

grep 명령어는 파일이나 디렉토리에서 검색하고자 하는 문자열을 지정할 수 있습니다. 파일을 지정할 경우 해당 파일에서 문자열을 찾을 수 있으며, 디렉토리를 지정할 경우 해당 디렉토리 내의 모든 파일에서 문자열을 찾을 수 있습니다. 또한, 파이프(|)를 사용하여 다른 명령어와 함께 사용할 수도 있습니다.

grep 명령어를 사용하는 방법은 간단합니다. 검색하고자 하는 문자열과 파일 또는 디렉토리를 지정하면 됩니다. 명령어는 다음과 같이 입력합니다.

 

grep [옵션] "문자열" [파일/디렉토리]

grep 명령어는 리눅스에서 자주 사용되는 유틸리티 중 하나이며, 이를 잘 활용하면 텍스트 파일에서 원하는 내용을 빠르고 쉽게 찾을 수 있습니다.

 

[명령어 옵션]

옵션 설명
-l 패턴이 있는 파일 이름만을 출력한다.
-n 패턴을 포함하는 줄을 출력할 때 줄번호와 함께 출력한다.
-v 패턴을 포함하는 줄을 제외하고 출력한다.
-c 패턴을 찾은 줄의 수를 출력한다.
-i 패턴을 찾을 때 대소문자를 구분하지 않는다.

 

(패턴 사용법) "# grep OPTIONS PATTERN file1"

grep 명령어를 사용할 때 패턴을 지정해주면, 해당 패턴을 포함하는 문자열을 검색할 수 있습니다. 다양한 패턴을 사용할 수 있으며, 이를 조합하여 더 복잡한 검색도 수행할 수 있습니다.

# grep 'ro*t' /etc/passwd 모든문자를 포함(영문자,숫자)
. # grep 'no...y' /etc/passwd (.에 하나의 영문자나 숫자를 치환)
^root # grep '^root' /etc/passwd 라인의 시작이 root인 라인을 검색
root$ # grep 'root$' /etc/group 라인의 끝이 root로 끝나는 라인을 검색
[abc] # grep 'user0[123]' /etc/passwd user0으로 시작하여 1이나 2나,3으로 끝나는 문자열

이외에도, 정규 표현식을 사용하여 검색할 수 있습니다. 정규 표현식은 다양한 패턴 매칭 템플릿을 제공하여 더욱 정교한 검색을 수행할 수 있습니다.

grep 명령어를 사용할 때, 원하는 패턴을 지정하여 해당 패턴을 포함하는 문자열을 검색할 수 있습니다. 이를 위해 다양한 패턴을 사용할 수 있으며, 이를 조합하여 더 복잡한 검색도 수행할 수 있습니다.

grep 명령어에서 사용되는 패턴을 표로 정리하면 다음과 같습니다.

 

패턴 설명
`` 모든 문자를 포함하는 패턴. 예를 들어, ro*t는 root, rot, rooot 등을 검색합니다.
. 하나의 영문자나 숫자를 치환하는 패턴. 예를 들어, no...y는 nobody, noisy 등을 검색합니다.
^ 라인의 시작이 특정한 문자열로 시작하는 라인을 검색하는 패턴. 예를 들어, ^root는 /etc/passwd 파일에서 root로 시작하는 라인을 검색합니다.
$ 라인의 끝이 특정한 문자열로 끝나는 라인을 검색하는 패턴. 예를 들어, root$는 /etc/group 파일에서 root로 끝나는 라인을 검색합니다.
[] 괄호 안에 있는 문자 중 하나를 검색하는 패턴. 예를 들어, [abc]는 /etc/passwd 파일에서 user01, user02, user03 등을 검색합니다.

또한, 정규 표현식을 사용하여 검색할 수도 있습니다. 정규 표현식은 다양한 패턴 매칭 템플릿을 제공하여 더욱 정교한 검색을 수행할 수 있습니다.

 

grep 명령어 옵션 실습

grep 명령어는 특정한 패턴을 검색하여 해당 패턴을 포함하는 줄을 화면에 출력하는 명령어입니다. grep 명령어는 주로 파일 내에서 특정한 패턴을 찾기 위해 많이 사용됩니다. 찾으려는 패턴을 정규식(Globally/Regular Expression/Print)이라고 표현합니다.

grep 명령어는 다양한 옵션을 제공하는데, 파일에서 특정 패턴을 검색할 때 -l 옵션을 사용하면 파일 내에서 패턴이 있는 파일명만을 출력할 수 있습니다. 또한, -n 옵션을 사용하면 패턴을 포함하는 줄을 출력할 때 줄번호와 함께 출력할 수 있습니다. -v 옵션은 패턴을 포함하지 않는 줄을 출력할 수 있습니다. -c 옵션은 패턴을 찾은 줄의 수를 출력할 수 있습니다. -i 옵션은 패턴을 찾을 때 대소문자를 구분하지 않습니다.

또한, grep 명령어는 다양한 패턴을 제공합니다. 예를 들어, 모든 문자를 포함하는 패턴을 찾으려면 *를 사용할 수 있습니다. .은 하나의 영문자나 숫자를 치환합니다. ^는 라인의 시작이 특정한 문자열로 시작하는 라인을 검색합니다. $는 라인의 끝이 특정한 문자열로 끝나는 라인을 검색합니다. []는 괄호 안에 있는 문자 중 하나를 검색합니다.

위 문서에서 설명하는 grep 명령어의 사용 예시는 다음과 같습니다:

파일에서 특정 문자열을 검색하는 경우:

grep [옵션] "문자열" [파일/디렉토리]

예를 들어, grep root /etc/passwd 명령어는 /etc/passwd 파일 내에서 root이라는 검색어를 찾아 해당하는 라인을 출력합니다.

옵션을 조합하여 검색하는 경우:

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

i나 v와 같은 옵션을 조합하여 대소문자를 구분하지 않거나 패턴과 일치하지 않는 행을 출력할 수 있습니다.

예를 들어, grep -i root /etc/passwd 명령어는 /etc/passwd 파일 내에서 root이라는 검색어를 대소문자를 구분하지 않고 찾아 해당하는 라인을 출력합니다.

다른 명령어와 함께 사용하는 경우:

CMD | grep [패턴]

grep 명령어는 다른 명령어와 함께 사용하여 파이프(|)를 통해 다른 명령어의 출력을 받아서 원하는 문자열을 찾을 수 있습니다.

예를 들어, ps -ef | grep socket 명령어는 ps -ef 명령어의 출력 결과 중 socket이라는 문자열을 찾아서 해당하는 라인을 출력합니다.

따라서, grep 명령어의 사용 방법은 간단합니다. 검색하고자 하는 문자열과 파일 또는 디렉토리를 지정하면 됩니다. grep 명령어를 잘 활용하면 텍스트 파일에서 원하는 내용을 빠르고 쉽게 찾을 수 있습니다.

 

환경 파일에 등록

# alias grep='grep -i'          => $HOME/.bashrc 
# alias grep='grep -i --color'  => $HOME/.bashrc < 검색된 단어에 색상을 입혀 가독성을 높여준다 >

# vi ~/.bashrc 
alias grep='grep -i --color'
# . ~/.bashrc 
# alias grep
# grep -n fedora /etc/passwd  (# cat -n /etc/passwd | grep fedora)
48:fedora:x:1001:1001::/home/fedora:/bin/bash
# grep -n root /etc/group
1:root:x:0:
# grep -l root /etc/group /etc/passwd /etc/hosts
/etc/group
/etc/passwd
# vi file.txt
root hello
roothello
testroottest
helloroot
# grep -w root file.txt
root hello

alias 명령어는 다른 명령어의 단축어를 만들 때 사용합니다. grep 명령어를 실행할 때 매번 옵션을 입력하기 귀찮을 경우, grep 명령어의 단축어를 만들어서 사용할 수 있습니다.

alias grep='grep -i --color' 명령어를 실행하면, 이제부터 grep 명령어를 실행할 때 -i와 --color 옵션이 자동으로 추가됩니다.

  • alias grep='grep -i --color': $HOME/.bashrc 파일에서 grep 명령어에 대해 단축어를 등록합니다. grep 명령어를 사용할 때마다 i와 -color 옵션이 자동으로 추가됩니다.

위 명령어를 실행하면 $HOME/.bashrc 파일이 열립니다. 파일 맨 마지막 줄에 alias grep='grep -i --color' 명령어를 추가합니다. 이후 . ~/.bashrc 명령어를 실행하여 변경된 $HOME/.bashrc 파일을 다시 실행합니다. 이제부터 grep 명령어를 실행할 때 -i와 --color 옵션이 자동으로 추가되어 검색된 단어에 색상이 입혀지게 됩니다.

grep 명령어를 사용하여 파일 내에서 특정 문자열을 검색하는 방법에 대한 몇 가지 예제 코드가 있습니다.

  • grep -n fedora /etc/passwd: /etc/passwd 파일에서 fedora라는 단어를 검색하고, 해당 단어가 있는 라인 번호와 함께 출력합니다. n 옵션을 사용하면 라인 번호와 함께 출력해줍니다.
  • grep -n root /etc/group: /etc/group 파일에서 root라는 단어를 검색하고, 해당 단어가 있는 라인 번호와 함께 출력합니다.
  • grep -l root /etc/group /etc/passwd /etc/hosts: /etc/group, /etc/passwd, /etc/hosts 파일에서 root라는 단어를 검색하고, 해당 단어가 있는 파일 이름만 출력합니다.
  • grep -w root file.txt: file.txt 파일에서 root라는 단어가 포함된 라인을 검색합니다. w 옵션을 사용하면 단어가 완전히 일치하는 라인만 검색합니다.

이제부터 grep 명령어를 사용할 때는 grep -i --color 대신 grep만으로도 충분히 사용할 수 있습니다. 이렇게 단축어를 등록하면, 명령어를 더 빠르게 실행할 수 있으며, 옵션을 일일이 입력하지 않아도 되므로 실수할 가능성도 줄어듭니다.

 

grep 명령어 패턴 실습

# nmcli con show
NAME   UUID                                  TYPE      DEVICE 
ens33  7da16185-c5c7-47de-8e44-07c3276d5006  ethernet  ens33

# grep -lr ens33 /etc
/etc/sysconfig/network-scripts/ifcfg-ens33

# cat /var/log/messages | grep -i aug | head -5
Aug 21 14:33:19 server1 kernel: Linux version 4.18.0-193.el8.x86_64 (mockbuild@kbuilder.bsys.centos.org) (gcc version 8.3.1 20191121 (Red Hat 8.3.1-5) (GCC)) #1 SMP Fri May 8 10:59:10 UTC 2020
Aug 21 14:33:19 server1 kernel: Command line: BOOT_IMAGE=(hd0,msdos1)/vmlinuz-4.18.0-193.el8.x86_64 root=/dev/mapper/cl-root ro resume=/dev/mapper/cl-swap rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet
Aug 21 14:33:19 server1 kernel: Disabled fast string operations
Aug 21 14:33:19 server1 kernel: x86/fpu: Supporting XSAVE feature 0x001: 'x87 floating point registers'
Aug 21 14:33:19 server1 kernel: x86/fpu: Supporting XSAVE feature 0x002: 'SSE registers'
# cat /var/log/messages | grep -i 'aug 26'

# ps
PID TTY          TIME CMD
13929 pts/2    00:00:00 bash
# ps -ef | grep 13929
root     13929 13927  0 14:00 pts/2    00:00:00 -bash
# ps -ef | grep bash
root      7117  7115  0 00:53 pts/3    00:00:00 -bash
root      7364  7117  0 01:47 pts/3    00:00:00 -bash
root     27308 27302  0 Jan26 pts/2    00:00:00 bash
# rpm -qa | grep postfix
postfix-8.13.8-2.el5
postfix-cf-8.13.8-2.el5

		# rpm -q postfix 
		# rpm -qa postfix  
		# rpm -qa | grep postfix

먼저 nmcli con show 명령어를 실행하여 현재 네트워크 연결을 확인합니다. 이는 우리의 검색에 대한 일부 맥락을 제공하기 위한 것입니다.

grep -lr ens33 /etc 명령어를 실행하여 디렉토리 /etc 내에서 "ens33" 패턴을 재귀적으로 검색합니다. l 옵션은 grep이 패턴을 포함하고 있는 파일의 이름만 출력하도록 지시하며, r 옵션은 grep이 디렉토리와 그 하위 디렉토리를 모두 검색하도록 지시합니다.

cat /var/log/messages | grep -i aug | head -5 명령어를 실행하여 로그 파일에서 패턴을 검색합니다. 이 명령어는 "aug" 패턴을 포함하는 로그 항목을 검색합니다. cat 명령어는 /var/log/messages 파일의 내용을 표시하며, head -5 명령어는 출력의 첫 5줄만 표시합니다. i 옵션은 grep이 패턴을 검색할 때 대소문자를 무시하도록 지시합니다.

cat /var/log/messages | grep -i 'aug 26' 명령어를 실행하여 특정 날짜에 대한 로그 항목을 검색합니다. 이 명령어는 "aug 26" 패턴을 포함하는 로그 항목을 검색합니다. 패턴에 공백이 포함되어 있기 때문에 작은 따옴표로 감싸야 합니다.

ps 명령어를 실행하여 실행 중인 프로세스의 목록을 표시합니다. 그런 다음 ps -ef | grep 13929와 같이 ps 명령어와 grep 명령어를 결합하여 특정 프로세스를 검색합니다. 이 예시에서는 ID가 13929인 프로세스를 검색하도록 지정했습니다. ef 옵션은 모든 실행 중인 프로세스를 full format으로 표시하도록 지정합니다.

마지막으로, rpm -qa | grep postfix 명령어를 실행하여 설치된 패키지를 검색합니다. 이 명령어는 "postfix" 단어가 포함된 모든 설치된 패키지를 표시합니다. qa 옵션은 시스템에 설치된 모든 패키지를 표시하도록 지정하며, grep 명령어는 출력을 "postfix" 단어를 포함하는 패키지만 표시하도록 필터링합니다. 이 예시에서처럼 명령어를 수정하여 특정 패키지의 자세한 정보를 표시할 수 있습니다.

 

파일내의 특정 패턴 여러개 검색하기

grep 명령어의 태생적 한계는 하나 이상의 패턴 검색을 지원하지 않는 것입니다. 파일 내에서 여러 패턴을 검색하는 경우 egrep (Extended grep)를 사용할 수 있습니다. 예를 들어, /var/log/messages 파일에서 'warn', 'err', 'crit', 'alert', 'emerg' 중 하나 이상의 패턴을 검색하려면 다음 명령어를 사용할 수 있습니다.

cat /var/log/messages | egrep -i '(warn|err|crit|alert|emerg)'

이와 같은 검색을 하려면 egrep를 사용해야 합니다. fgrep(Fixed grep)는 문자열이 정확히 일치하는 경우에만 검색하므로 egrep보다 빠릅니다. 예를 들어, 파일 내에서 'root'로 시작하는 줄을 검색하려면 다음 명령어를 사용할 수 있습니다.

fgrep '^root' file1

또는 egrep를 사용하여 두 개 이상의 패턴을 검색할 수 있습니다. 예를 들어, /etc/passwd 파일에서 'root' 또는 'fedora'를 검색하려면 다음 명령어를 사용할 수 있습니다.

egrep "fedora|root" /etc/passwd

따라서, egrep는 여러 패턴을 검색할 수 있으며 fgrep는 정확한 문자열 검색에 최적화되어 있습니다.

 

로그 파일에서 에러 메세지 검색

로그 파일을 출력합니다.

# cat /var/log/messages

로그 파일에서 경고(warning), 에러(error), 크리티컬(critical), 얼럿(alert), 응급사항(emergency)에 해당하는 메시지를 찾습니다.위 명령어는 에러 메시지가 포함된 모든 줄을 출력합니다.

# cat /var/log/messages | egrep –i '(warn|err|crit|alert|emerg)'

의심스러운 사용자의 계정(fedora, user01)이 있는지 확인합니다.위 명령어는 패턴과 일치하지 않는 모든 줄을 출력합니다.

또한, 위 명령어는 -v 옵션을 사용하여 검색 패턴(fedora, user01)을 제외한 모든 줄을 출력합니다.

# egrep -v "fedora|user01" /etc/passwd

위와 같은 명령어를 통해, 사용자는 원하는 정보를 빠르고 쉽게 찾아 낼 수 있습니다.

 

특정한 단어를 제외하고 검색

# ps –ef | grep sshd | grep –v grep 

grep : 강력한 패턴 매칭 템플릿을 정의하기 위해 "정규 표현식"을 사용할 수 있다.  
egrep[옵션] "패턴|패턴|..." [대상파일들] : 확장된 정규 표현식을 사용하며, 찾아낼 패턴을 여러개 지정할 수 있다. 
'|'기호는 불린 연산자 "OR"에 해당하므로, 정해진 패턴들에 포함되는 모든 라인을 보여준다.  
fgrep[옵션] 패턴 [대상파일들] : 패턴과 정확히 일치하는 것만을 찾아 준다.

위 코드는 ps 명령어를 사용하여 현재 실행 중인 프로세스 중 sshd라는 프로세스를 찾고, 이 결과에서 grep 명령어를 사용하여 grep 자체를 제외한 sshd 프로세스를 찾아내는 것입니다.

ps 명령어는 현재 실행 중인 프로세스 목록을 보여주는 명령어입니다. -ef 옵션은 실행 중인 모든 프로세스를 보여주며, | 기호는 이전 명령어의 결과를 다음 명령어의 입력으로 전달하는 파이프(pipe) 연산자입니다. 이어서 grep sshd를 사용하여 sshd 프로세스를 찾아냅니다. 그리고 -v 옵션을 사용하여 grep 명령어 자체를 제외한 sshd 프로세스만을 보여줍니다.

따라서 위 명령어의 결과는 sshd 프로세스가 실행 중인 경우 해당 프로세스를 보여주고, grep 명령어 자체가 실행 중이거나 sshd 프로세스가 실행 중이지 않은 경우 아무 결과도 보여주지 않습니다.

 

find 명령어

find 명령어는 디렉토리 안에서 원하는 파일을 찾는 데 유용한 명령어입니다. 특히 대형 및 복잡한 파일 시스템에서 작업할 때 유용합니다. find를 사용하려면 찾기를 시작할 디렉토리를 지정하고 필요한 옵션을 제공한 후 원하는 파일 이름을 지정하면 됩니다. find를 사용하는 장점 중 하나는 검색 결과를 필터링하는 데 사용할 수 있는 다양한 기준을 지원한다는 점입니다. 예를 들어 파일 크기, 소유자, 수정 날짜에 따라 파일을 검색할 수 있습니다. 또한 find를 사용하여 검색 결과로 반환된 파일에 대해 명령을 실행할 수 있습니다. 이것은 반복적인 작업을 자동화하거나 대량의 파일에 대한 일괄 작업을 수행하는 강력한 방법이 될 수 있습니다. 전반적으로 find는 파일을 자주 사용하는 경우 도구 상자에 추가해야 할 다재다능하고 강력한 명령어입니다.

 

[명령어 형식]

# find [검색시작위치] [옵션1] [인자값1] [옵션2] [인자값2] ...

여기서 [검색시작위치]는 찾기를 시작할 디렉토리입니다. [옵션]은 찾기를 수행할 때 사용할 옵션입니다. [인자값]은 찾기를 수행할 때 사용할 인자값입니다. 예를 들어, "-name" 옵션을 사용하여 파일 이름을 지정할 수 있습니다. 또한 "-type" 옵션을 사용하여 파일 유형을 지정할 수도 있습니다. 이 명령어를 사용하여 디렉토리 내에서 특정 파일을 찾을 수 있습니다.

 

[명령어 옵션]

옵션 설명
-name 파일 이름을 기준으로 검색
-iname 대소문자를 구별하지 않고 파일 이름을 기준으로 검색
-perm 파일 권한을 기준으로 검색
-type 파일의 종류를 기준으로 검색
b 블록 파일
c 문자
d 디렉토리
f 파일
l 링크
s 소켓
-size 파일의 크기를 기준으로 검색
+n n보다 크다
-n n보다 작다
n n이다
b 512-byte
c Bytes (Character = Byte)
k Kilo Byte
M Mega Bytes
G Giga Bytes
w 2-byte
-links 링크의 개수를 기준으로 검색
-user 사용자 ID를 기준으로 검색
-group 그룹 ID를 기준으로 검색
-atime 특정 기간 이상 접근하지 않은 파일을 기준으로 검색
-mtime 특정 기간 이상 수정되지 않은 파일을 기준으로 검색
-inum number 지정된 inode 번호와 파일을 찾는다.
-print 표준출력으로 검색된 파일 출력: GNU는 디펄트, Unix는 필수 입력
-exec command {} \; 찾은 각 파일에 대해 지정된 명령을 실행
-ok command {} \; 실행여부(실행 되어 있는지 아닌지)를 사용자에게 확인 후 명령을 실행

(형식1) # find / -name core -type [f|d] (# find / -name "*oracle*" -type f)
이 명령어는 루트 디렉토리 아래 이름이 "core"인 파일과 디렉토리를 검색합니다. "find" 명령어를 사용하여 이름에 "oracle"가 포함된 파일을 검색할 수도 있습니다.

(형식2) # find / -user user01 -group class1
이 명령어는 사용자 "user01"과 그룹 "class1"에 속한 파일과 디렉토리를 검색합니다.

(형식3) # find / -mtime [-7|7|+7]
이 명령어는 최근 7일 이내에 수정된 파일과 디렉토리, 정확히 7일 전에 수정된 파일과 디렉토리, 그리고 7일 이전에 수정된 파일과 디렉토리를 검색합니다.

(형식4) # find / -perm [-755|755]
이 명령어는 권한이 정확히 755인 파일과 디렉토리, 그리고 755보다 작은 권한을 가진 파일과 디렉토리를 검색합니다.

(형식5) # find / -size [-300M|300M|+300M]
이 명령어는 300 메가바이트 미만, 정확히 300 메가바이트, 그리고 300 메가바이트보다 큰 크기를 가진 파일과 디렉토리를 검색합니다.

(형식6) # find / -name core -type f -exec rm {} \\\\;
이 명령어는 이름이 "core"인 모든 파일을 찾아서 삭제합니다.

 

파일 이름 검색(예: # find / -name core –type f)

find 명령어는 파일 시스템에서 특정 조건에 맞는 파일이나 디렉토리를 찾는 데 사용됩니다. 이를 통해 원하는 파일이나 디렉토리를 쉽게 찾아낼 수 있습니다. 첫 번째 예제에서는 파일 이름을 검색하는 방법을 알아보겠습니다.

/test -+- dir1 - file1
			 |
			 +- dir2 - file3
		   |
			 +- file1
			 |
			 +- file2

위와 같은 디렉토리 구조에서 file1 이라는 이름을 가진 파일을 찾고자 한다면, 다음과 같이 find 명령어를 사용할 수 있습니다.

# cd /test
# find . -name file1
./dir1/file1
./file1

위 명령어는 현재 디렉토리(.)부터 시작해 file1 이라는 이름을 가진 파일을 찾아서 출력합니다. 파일 이름 뿐만 아니라, 디렉토리 이름도 file1 인 경우 모두 출력됩니다.

만약 파일만 검색하고 싶다면 -type f 옵션을 추가하면 됩니다.

# find . -name file1 -type f
./dir1/file1
./file1

-type 옵션은 검색 대상이 파일인지 디렉토리인지를 지정하는 옵션입니다. f 는 파일을 의미하며, d 는 디렉토리를 의미합니다.

또한, 특정 패턴을 가진 파일을 검색하고 싶다면, -name 옵션 뒤에 검색하고자 하는 패턴을 지정해주면 됩니다. 예를 들어, *.log 확장자를 가진 파일을 검색하고 싶다면 다음과 같이 입력합니다.

# find /var -name "*.log" -type f
/var/log/audit/audit.log
/var/log/sssd/sssd.log
/var/log/sssd/sssd_implicit_files.log
/var/log/sssd/sssd_nss.log
/var/log/sssd/sssd_kcm.log
/var/log/tuned/tuned.log
..... (중략) .....

위 명령어는 /var 디렉토리 아래에서 확장자가 .log 인 파일을 모두 검색합니다.

 

사용자/그룹 검색(예: # find / -user user01 -group class1)

두 번째 예제에서는 사용자나 그룹으로 파일을 검색하는 방법을 알아보겠습니다.

# find /home -user fedora -group fedora
/home/fedora
/home/fedora/top.seceret.mail
/home/fedora/.bashrc
..... (중략) .....

위 명령어는 /home 디렉토리 아래에서 소유자가 fedora 이고 그룹이 fedora 인 파일을 검색합니다.

검색 결과를 자세히 확인하고 싶다면 -ls 옵션을 추가하면 됩니다.

# find /home -user fedora -group fedora -ls

 

날짜 검색(예: # find / -mtime 7)

세 번째 예제에서는 파일의 수정 날짜에 따라 검색하는 방법을 알아보겠습니다.

# cd dir2
# touch file1 file2 file3 file4 file5 file6

# date 08191111
Thu Aug 19 11:11:00 KST 2010

위와 같이 dir2 디렉토리 아래에 여러 개의 파일을 생성한 후, 날짜를 확인하고자 할 때는 date 명령어를 사용할 수 있습니다.

# touch -t 08181111 file1
# touch -t 08171111 file2
# touch -t 08161111 file3
# touch -t 08151111 file4
# touch -t 08141111 file5
# touch -t 08131111 file6

위 명령어는 파일들에 대해 수정 날짜를 설정하는 명령어입니다. 이렇게 설정된 수정 날짜를 기준으로 find 명령어를 사용해 파일을 검색할 수 있습니다.

# find . -mtime 3 -type f /* 수정 날짜가 3일 전인 파일 */
./file3
# find . -mtime -3 -type f /* 수정한 날짜가 3일 이내인 파일 */
./file3
./file2
./file1
# find . -mtime +3 -type f /* 수정한 날짜가 3일 이전인 파일 */
./file6
./file5
./file4

위 명령어는 현재 디렉토리(.) 아래에서 파일 수정 날짜를 기준으로 검색합니다. -mtime 옵션 뒤의 숫자는 일(day) 단위로 지정됩니다. -mtime -3 은 오늘을 포함하여 최근 3일 이내에 수정된 파일을 검색하며, -mtime +3 은 수정 날짜가 3일 이전인 파일을 검색합니다.

 

파일 속성 정보

file6      file5       file4        file3      file2      file1
  -----+----------+------------+----------+----------+----------+---------+
     0813        0814         0815       0816      0817        0818      0819

위는 파일 속성 정보를 나타낸 것입니다. 이는 파일의 이름과 수정한 날짜를 확인할 수 있습니다. 파일을 수정하는 일은 매우 중요합니다. 파일을 수정하는 이유는 파일의 내용을 변경하거나, 파일의 이름을 변경할 때 등 다양한 이유가 있을 수 있습니다. 파일을 수정할 때는 파일 속성을 변경해야 합니다. 파일 속성을 변경하지 않으면 파일의 내용이 변경되어도 수정한 날짜는 변경되지 않으므로, 파일을 찾을 때 혼란이 생길 수 있습니다.

아래는 파일 속성 정보를 확인하는 명령어입니다.

# touch -t 08181111 file1
# touch -t 08171111 file2
# touch -t 08161111 file3
# touch -t 08151111 file4
# touch -t 08141111 file5
# touch -t 08131111 file6
# ls -l file*
-rw-r--r-- 1 root root 0 Aug 18 11:11 file1
-rw-r--r-- 1 root root 0 Aug 17 11:11 file2
-rw-r--r-- 1 root root 0 Aug 16 11:11 file3
-rw-r--r-- 1 root root 0 Aug 15 11:11 file4
-rw-r--r-- 1 root root 0 Aug 14 11:11 file5
-rw-r--r-- 1 root root 0 Aug 13 11:11 file6

위는 파일을 수정하는 명령어입니다. 파일을 수정하는 방법은 다양합니다. 여기서는 touch 명령어를 사용하였습니다. touch 명령어는 파일을 생성하거나, 파일의 수정 시간을 변경할 때 사용합니다. 파일을 생성할 때는 파일 이름을 지정하면 됩니다. 파일의 수정 시간을 변경할 때는 -t 옵션과 함께 시간을 지정하면 됩니다.

아래는 파일을 찾는 명령어입니다.

# find . -mtime 3 -type f /* 수정 날짜가 3일전인 파일 */
./file3

위는 수정 날짜가 3일전인 파일을 찾는 명령어입니다. find 명령어를 사용하면 파일을 찾을 수 있습니다. -mtime 옵션을 사용하면 파일의 수정 날짜를 기준으로 파일을 찾을 수 있습니다. -type 옵션을 사용하면 파일만 찾을 수 있습니다.

# find . -mtime -3 -type f /* 수정한 날짜가 3일이 안된 파일 */
./file3
./file2
./file1

위는 수정한 날짜가 3일이 안된 파일을 찾는 명령어입니다. -mtime 옵션에 -를 사용하면 수정한 날짜가 n일 이내인 파일을 찾을 수 있습니다.

# find . -mtime +3 -type f /* 수정한 날짜가 3일이 지난 파일 */
./file6
./file5
./file4

위는 수정한 날짜가 3일이 지난 파일을 찾는 명령어입니다. -mtime 옵션에 +를 사용하면 수정한 날짜가 n일 이전인 파일을 찾을 수 있습니다.

 

퍼미션 검색(예: # find / -perm 755 -type f)

네 번째 예제에서는 파일의 퍼미션에 따라 검색하는 방법을 알아보겠습니다.

# cd /test
# mkdir dir3
# cd dir3
# touch file1 file2 file3 file4 file5 file6 file7 file8

# chmod 000 file1  (---)
# chmod 100 file2  (--x)
# chmod 200 file3  (-w-)
# chmod 300 file4  (-wx)
# chmod 400 file5  (r--)
# chmod 500 file6  (r-x)
# chmod 600 file7  (rw-)
# chmod 700 file8  (rwx)

# ls -l file*
---------- 1 root root3043 3월 18 14:54 file1
---x------ 1 root root362131 3월 18 14:52 file2
--w------- 1 root root  0 3월 18 14:52 file3
--wx------ 1 root root  0 3월 18 14:52 file4
-r-------- 1 root root  0 3월 18 14:52 file5
-r-x------ 1 root root 0 3월 18 14:52 file6
-rw------- 1 root root  0 3월 18 14:52 file7
-rwx------ 1 root root 0 3월 18 14:52 file8

위와 같이 dir3 디렉토리 아래에 여러 개의 파일을 생성하고, 각 파일의 퍼미션을 설정한 후 ls -l 명령어를 사용해 확인할 수 있습니다.

# find . -perm 600 -type f –ls

위 명령어는 현재 디렉토리(.) 아래에서 퍼미션 값이 600 인 파일을 검색합니다. -perm 옵션 뒤에는 검색하고자 하는 퍼미션 값을 지정합니다.

만약 파일 퍼미션 값이 정확히 일치하는 파일을 검색하고 싶다면, -perm 옵션 뒤에 -를 붙이면 됩니다. 예를 들어, 파일 퍼미션 값이 400 인 파일을 검색하고 싶다면 다음과 같이 입력합니다.

# find . -perm -400 -type f -ls

위 명령어는 현재 디렉토리(.) 아래에서 퍼미션 값이 400 인 파일을 검색합니다.

 

파일 크기 검색(예: # find / -size 50k -type f)

다섯 번째 예제에서는 파일 크기에 따라 검색하는 방법을 알아보겠습니다.

# cp /etc/passwd file10
# cp /etc/services file11
# ls -l

* file1-8   0    Bytes
* file10  3228   Bytes
* file11  692252 Bytes

위와 같이 파일을 생성한 후, 파일 크기를 확인하고자 할 때는 ls -l 명령어를 사용할 수 있습니다.

# find . -size 2490c –type f    /* 정확히 일치되는 용량만 검색 */

위 명령어는 현재 디렉토리(.) 아래에서 파일 크기가 2490 바이트인 파일을 검색합니다. -size 옵션 뒤에는 검색하고자 하는 용량 값을 지정합니다.

만약 파일 크기가 일치하지 않는 파일을 검색하고 싶다면, -를 붙이면 됩니다. 예를 들어, 파일 크기가 1980 바이트보다 작은 파일을 검색하고 싶다면, 다음과 같이 입력합니다.

# find . -size -1980c –type f   /* 일치되는 것 제외한 파일 크기가 2027bytes 미만 */

위 명령어는 현재 디렉토리(.) 아래에서 파일 크기가 1980 바이트보다 작은 파일을 검색합니다.

만약 파일 크기가 일치하는 파일을 제외한 파일을 검색하고 싶다면, +를 붙이면 됩니다. 예를 들어, 파일 크기가 1980 바이트보다 큰 파일을 검색하고 싶다면, 다음과 같이 입력합니다.

# find . -size +1980c –type f   /* 파일 크기가 2027bytes 보다 큰 것 */

 

디렉토리안에 특정한 패턴을 가진 파일들을 삭제(# find / -name file -type f -exec rm {} \;)

이번 예제에서는 디렉토리 내에 특정한 패턴을 가진 파일들을 삭제하는 방법을 알아보겠습니다. 우선, find 명령어를 사용하여 디렉토리 내에서 파일 이름이 file1 인 파일을 검색할 수 있습니다.

# cd /test
# find . -name file1 -type f /* 파일의 이름이 file1인 것 */
./file1
./dir2/file1

위 명령어를 실행하면 test 디렉토리 내에서 파일 이름이 file1 인 파일을 검색할 수 있습니다. 검색된 파일들에 대해 다양한 명령어를 실행할 수 있습니다.

# find . -name file1 -type f -ls
# find . -name file1 -type f -exec chown -v user01 {} \\\\;
# find . -name file1 -type f -ls
# find . -name file1 -type f -exec chmod -v 640 {} \\\\;
# find . -name file1 -type f -ls
# find . -name file1 -type f -exec rm -fv {} \\\\;
# find . -name file1 –type f

위 명령어는 검색된 파일들에 대해 ls, chown, chmod, rm 명령어를 실행하며, 검색된 파일들의 상세 정보를 출력합니다. -exec 옵션에서 중괄호 {} 는 검색된 파일들을 의미하며, \\\\\\\\; 는 명령어의 마지막을 나타냅니다.

또한, -exec 옵션에서 중괄호 {} 는 검색된 파일들을 의미하며, \\\\\\\\; 는 명령어의 마지막을 나타냅니다. find 명령어에서 -exec 옵션에서는 검색된 파일들을 기반으로 다양한 명령어를 실행할 수 있습니다. 이때, 중괄호 {} 는 검색된 파일들을 의미하며, 마지막에 \\\\\\\\; 를 입력하여 명령어를 종료합니다.

다음은 디렉토리에서 특정한 패턴을 가진 파일을 삭제하기 위해 find 명령어와 -exec 옵션을 사용하는 예제입니다:

# find /경로/디렉토리 -name "*패턴*" -type f -exec rm {} \\\\;

이 명령어는 지정된 디렉토리에서 이름에 해당 패턴이 포함된 파일을 찾고 삭제합니다. -type f 옵션은 디렉토리가 아닌 파일만 검색하도록 합니다. {} 기호는 find 명령어에 의해 찾은 파일을 나타내며, 명령어 끝에 \\\\;를 사용하여 -exec 옵션을 종료합니다.

따라서, 위 명령어를 사용하여 디렉토리 내에 특정한 패턴을 가진 파일들을 삭제할 수 있습니다. find 명령어를 사용하여 삭제하고자 하는 파일을 찾은 후, -exec 옵션을 사용하여 rm 명령어를 실행합니다. 이를 통해, 디렉토리 내에 특정한 패턴을 가진 파일들을 쉽게 삭제할 수 있습니다.

 

오래된 로그 기록 삭제

한달(시스템 생성일 ~ 30일)이 지난 로그파일은 그 의미를 상실하게 된다. 따라서 일정 시간이 지난 로그파일의 경우 find라는 명령어를 이용하여 파일을 주기적으로 삭제해 주도록 한다.
# find /Log_Dir1 -name "*.log" -type f -mtime +30 -exec rm –f {} \\;
# find /Log_dir2 -name "*.log" -type f -mtime +60 -exec rm –f {} \\;

 

일정 시간이 지난 로그파일은 그 의미를 상실하게 됩니다. 따라서 일정 시간이 지난 로그파일의 경우 find라는 명령어를 이용하여 파일을 주기적으로 삭제해 주도록 하는 것이 좋습니다.

$ find /Log_Dir1 -name "*.log" -type f -mtime +30 -exec rm -f {} \\\\;

명령어 설명: /Log_Dir1 디렉토리에서 이름이 "*.log"인 파일 중에서 30일 이전에 수정된 파일을 찾아서 삭제합니다.

추가로 할 일: 만약 삭제된 파일이 있을 경우, 해당 내용을 기록하는 로그를 작성하는 것이 좋습니다.

$ find /Log_dir2 -name "*.log" -type f -mtime +60 -exec rm -f {} \\\\;

명령어 설명: /Log_dir2 디렉토리에서 이름이 "*.log"인 파일 중에서 60일 이전에 수정된 파일을 찾아서 삭제합니다.

추가로 할 일: 명령어 실행 전에 삭제할 파일의 리스트를 출력하고, 사용자에게 확인을 받는 것이 좋습니다.

 

파일시스템이 갑자기 풀(Full) 나는 경우

파일시스템이 갑자기 가득차서 문제가 발생한 경우 "find" 명령어를 사용하여 일부 파일을 삭제하고 디스크 공간을 확보할 수 있습니다. 다음은 파일 이름, 파일 크기, 수정 날짜를 기준으로 파일을 검색하고 삭제하는 방법입니다.

파일 이름으로 검색하기

파일 이름을 기준으로 파일을 검색하려면 "-name" 옵션을 사용하면 됩니다. 다음은 "/var/server/log" 디렉토리에서 이름이 "file.log"인 파일을 검색하는 예제입니다.

# find /var/server/log -name "file.log" -type f
/var/server/log/file.log

검색 결과에서 파일을 삭제하려면 다음과 같이 "-exec" 옵션과 "rm" 명령어를 사용하면 됩니다.

# find /var/server/log -name "file.log" -type f -exec rm {} \\\\;

파일 크기로 검색하기

파일 크기를 기준으로 파일을 검색하려면 "-size" 옵션을 사용하면 됩니다. 다음은 "/var/server/log" 디렉토리에서 크기가 1GB 이상인 파일을 검색하는 예제입니다.

# find /var/server/log -size +1G -type f
/var/server/log/file.log

검색 결과에서 파일을 삭제하려면 다음과 같이 "-exec" 옵션과 "rm" 명령어를 사용하면 됩니다.

# find /var/server/log -size +1G -type f -exec rm {} \\\\;

수정 날짜로 검색하기

수정 날짜를 기준으로 파일을 검색하려면 "-mtime" 옵션을 사용하면 됩니다. 다음은 "/var/server/log" 디렉토리에서 최근 2일 이내에 수정된 파일을 검색하는 예제입니다.

# find /var/server/log -mtime -2 -type f
/var/server/log/file.log

검색 결과에서 파일을 삭제하려면 다음과 같이 "-exec" 옵션과 "rm" 명령어를 사용하면 됩니다.

# find /var/server/log -mtime -2 -type f -exec rm {} \\\\;

검색 조건 결합하기

검색 조건을 결합하여 파일을 검색할 수도 있습니다. 예를 들어, 다음은 "/var/server/log" 디렉토리에서 최근 2일 이내에 크기가 512MB 이상인 파일을 검색하는 예제입니다.

# find /var/server/log -mtime -2 -size +512M -type f
/var/server/log/file.log

검색 결과에서 파일을 삭제하려면 다음과 같이 "-exec" 옵션과 "rm" 명령어를 사용하면 됩니다.

# find /var/server/log -mtime -2 -size +512M -type f -exec rm {} \\\\;

파일을 삭제하기 전에 검색 결과를 다시 한 번 확인하고 삭제할 파일이 맞는지 확인해야 합니다. 또한, 삭제된 파일은 복구할 수 없으므로 신중하게 처리해야 합니다.

(실무 예) 에러메세지가 들어 있는 startup script 검색

# /was/bin/startup.sh 
..... Server Error .....
# find /was –type f –exec grep –l 'Server Error' {} \\;
/was/conf/server.xml
# vi /was/conf/server.xml
/Server Error
......
if 조건 ; then

else
echo "Server Error"
fi

위 예제는 에러메시지가 들어 있는 startup script를 검색하는 예제입니다. 아래는 예제 코드의 각 단계입니다.

/was/bin/startup.sh 스크립트에서 "Server Error"를 검색합니다.

find 명령어를 사용하여 /was 디렉토리에서 파일을 찾습니다.

type f 옵션을 사용하여 파일만 찾습니다.

exec 옵션을 사용하여 찾은 파일에서 grep -l 'Server Error' 명령을 실행합니다.

검색 결과로 출력된 파일 중 하나인 /was/conf/server.xml 파일을 열어 "Server Error"를 검색합니다.

검색된 스크립트에서 if-else 문을 사용하여 "Server Error"를 출력하도록 설정합니다.

 

에러 메세지를 검색하는 방법

<http://www.google.co.kr>
-> site:.redhat.com "Server Error"
-> 가상화 .pdf
-> 가상화 .ppt
-> "Server Error1" AND "Server Error2" (AND/OR)
-> "Server Error1"

에러 메시지를 검색하는 방법은 다음과 같습니다.

구글 검색창에 http://www.google.co.kr을 입력합니다.

구글 검색창에 site:.redhat.com "Server Error"를 입력합니다. 이렇게 하면 redhat.com 내에서 "Server Error"를 검색할 수 있습니다.

가상화 파일을 검색하려면 구글 검색창에 가상화 .pdf 또는 가상화 .ppt를 입력합니다.

"Server Error1"과 "Server Error2" 중 하나만 포함된 결과를 검색하려면 "Server Error1" AND "Server Error2" 또는 "Server Error1" OR "Server Error2"를 입력합니다.

"Server Error1"을 검색하려면 "Server Error1"을 입력합니다.

따라서 이러한 검색 기능은 검색 엔진을 사용하면 빠르고 쉽게 수행할 수 있습니다.

반응형