본문 바로가기

Learning/└◆Shell Scripts

[ShellScripting] 유닉스 명령어(1) grep CMD

________________________________________________________________________________

 

 

1 부 본쉘

 

1 장 유닉스 쉘

2 장 본쉘의 개요

3 장 본쉘의 동작

4 장 유닉스 명령어

5 장 본셀의 특징

6 장 본셀 프로그래밍

 

________________________________________________________________________________

 

 

4 장 유닉스 명령어

 

 

-----------------

1. grep 명령어

2. sed 명령어

3. awk 명령어

4. 기타 명령어

-----------------

 

 

 

 

다음에 나오는 나오는 grep, sed, awk(nawk) 명령어는 본쉘 프로그래밍을 잘 작성하기 위해 반드시 필요한 기본적인 명령어들이다. 유닉스에서는 고급 명령어에 속하고 활용범위가 넓으며 많은 기능들이 존재한다. 그러므로 아래의 3개의 명령어를 통해 효율적인 스크립트를 작성할 수 있다.

 

이 외에도 cut, sort, tr, paste 명령어들도 유닉스의 고급 명령어들로서 쉘프로그래밍에서 많이 사용되고 있다. 본 교제에서는 자세하게 다루고 있지 않지만 유용하기 때문에 따로 공부하기 바란다.

 

쉘프로그램에서 유용하게 사용되는 명령어들

cut, sort, tr, paste, date, cpio, crypt, du, diff, cmp, echo, expr

grep, fgrep, egrep, find, fmt, id, mail, mailx, nohup, pwd, sed,

sleep, spell, split, head, tail, tee, touch, time, xargs, wc

 

grep 명령어와 비슷한 egrep, fgrep 명령어도 존재하지만 이 교재에서는 grep 명령어만을 다루고 있다. egrep, fgrep 명령어는 특히 프로세스를 다루는 경우에 유용하게 쓰인다. egrep(1), fgrep(1) 명령어도 매뉴얼을 참고하여 자세한 사용방법에 대해 익혀 두어야 한다.

 

 

 

 

1

grep 명령어(globally/regular expression/print)

 

 

grep 명령어는 가장 널리 많이 쓰이고 있으며 파일안에서 특정한 패턴을 찾을려고 할 때 주로 사용한다. 이 명령어는 하나 혹은 여러 파일에서 특정 문자열의 패턴을 찾는다. 패턴에 공백 문자가 포함되어 있으면 따옴표로 묶어야 한다. 즉 패턴은 따옴표로 묶인 문자열이거나 한 단어이어야 한다. 패턴 뒤에 입력한 단어들은 모두 파일이름으로 인식된다.

 

솔라리스에서는 유닉스에서 사용하는 grep 명령어 외에도 자유 소프트웨어 재단(FSF)이 제공하는 무료 GNU grep도 포함하고 있다. 솔라리스에서는 기본 명령어인 /usr/bin/grep 명령어와 GNU grep 명령어인 /usr/xpg4/bin/grep 명령어가 공존한다.

 

/usr/bin/grep UNIX grep 명령어

/usr/xpg4/bin/grep GNU grep 명령어

 

 

(명령어 형식)

# grep OPTION PATTERN filename

 

 

 

(1). grep 명령어의 옵션

 

옵션

설 명

-b

검색 결과의 각 행앞에 검색된 위치의 블록 번호를 표시한다. 검색 내용이 디스크의 어디쯤 있는지 위치를 알아낼때 유용하다.

-c

검색 결과를 출력하지 않는다. 찾은 문자열 라인의 개수만을 출력한다.

-h

파일이름을 출력하지 않는다.

-i

대소문자 구분을 하지 않는다. 즉 대문자와 소문자를 동일하게 취급한다.

-l

패턴이 존재하는 파일의 이름만 출력한다. 개행문자로 구분한다.

-n

파일내에서 행 번호를 함께 출력한다.

-s

에러메세지 외에는 출력하지 않는다. 종료상태를 검사할 때 유용하게 쓸수 있다.

-v

패턴이 존재하지 않는 행만 출력한다.

-w

패턴 표현식을 하나의 단어로 취급하여 검색한다. <>을 양쪽에 사용한 것과 같은 효과를 낸다. grep에서만 사용할 수 있다.

 

 

 

[EX1] 기본적인 사용법

다음은 /etc/passwd 파일에서 root라는 사용자가 존재하는지를 출력하는 예제이다.

 

# grep root /etc/passwd

root:x:0:0:Super-User:/:/bin/ksh

 

# cat /etc/passwd | grep root

root:x:0:0:Super-User:/:/bin/ksh

 

 

[참고] 다음예는 솔라리스에서 grep 명령의 기본 형식이 사용되고 있는 활용 형식이다.

# CMD | grep PATTERN

# ps -ef | grep inetd /* inetd 데몬을 떠 있는지 확인 */

# cat /etc/passwd | grep user01 /* user01 사용자가 존재하는지 확인 */

# pkginfo | grep SUNWapchd /* SUNWapchd 패키지가 존재하는지 확인 */

# patchadd -p | grep 115158-10 /* 115158-10 패치가 설치 되어 있는지 확인 */

# netstat -an | grep ESTABLISH /* TCP Establish Connection 확인 */

[EX2] -c 옵션 (-c : count)

다음은 /etc/default/login 파일에서 'The'라는 단어가 포함된 라인의 개수를 출력하는 예제이다.

 

# grep -c 'The' /etc/default/login (# grep 'The' /etc/default/login | wc -l)

3

 

 

 

[EX3] -v 옵션 (-v : inVerse, except)

다음은 /etc/passwd 파일에서 root 사용자를 제외한 모든 사용자에 관한 정보를 확인하는 예제이다.

 

# grep -v 'root' /etc/passwd

daemon:x:1:1::/:

bin:x:2:2::/usr/bin:

sys:x:3:3::/:

adm:x:4:4:Admin:/var/adm:

lp:x:71:8:Line Printer Admin:/usr/spool/lp:

uucp:x:5:5:uucp Admin:/usr/lib/uucp:

nuucp:x:9:9:uucp Admin:/var/spool/uucppublic:/usr/lib/uucp/uucico

smmsp:x:25:25:SendMail Message Submission Program:/:

listen:x:37:4:Network Admin:/usr/net/nls:

gdm:x:50:50:GDM Reserved UID:/:

webservd:x:80:80:WebServer Reserved UID:/:

postgres:x:90:90:PostgreSQL Reserved UID:/:/usr/bin/pfksh

svctag:x:95:12:Service Tag UID:/:

nobody:x:60001:60001:NFS Anonymous Access User:/:

noaccess:x:60002:60002:No Access User:/:

nobody4:x:65534:65534:SunOS 4.x NFS Anonymous Access User:/:

 

 

다음은 현재 시스템에 붙어 있는 디바이스에 대한 목록(인스탄스 이름)을 출력하는 예이다.

# prtconf | grep -v not

System Configuration: Sun Microsystems sun4u

Memory size: 2048 Megabytes

System Peripherals (Software Nodes):

 

SUNW,Sun-Blade-100

scsi_vhci, instance #0

options, instance #0

pci, instance #0

ebus, instance #0

isa, instance #1

..... (중략) .....

pci, instance #0

pci, instance #1

SUNW,hme, instance #0

SUNW,isptwo, instance #0

SUNW,m64B, instance #0

SUNW,UltraSPARC-IIe, instance #0

iscsi, instance #0

pseudo, instance #0

 

 

 

[EX4] -n 옵션 (-n: number line)

다음은 초기화 스크립트인 /etc/init.d/nfs.server 파일에서 공유된 정보인 ‘share' 단어를 검색하여 출력하는 예제이다.

 

# grep -n 'share' /etc/dfs/dfstab

2:# Place share(1M) commands here for automatic execution

6:# run the NFS daemon processes and the share commands, after adding

9:# share [-F fstype] [ -o options] [-d "<text>"] <pathname> [resource]

11:# share -F nfs -o rw=engineering -d "home dirs" /export/home2

..... (중략) .....

 

 

 

[EX5] -l 옵션 (-l : List Files)

다음은 /etc/init.d 디렉토리 하위에 파일과 디렉토리 중에서 grep 이라는 단어가 포함된 파일을 찾는 예제이다.

 

# grep -l 'root' /etc/hosts /etc/passwd /etc/group

/etc/passwd

/etc/group

 

 

 

[참고] 특정한 패턴이 존재하는 파일 검색

 

찾을려고하는 문자열이 있는 파일들을 찾을때

 

/test ----+---- passwd

|

+---- hosts

|

+---- dir01 ----+---- group

|

+---- dumpadm.conf

 

실습 준비

# cp /etc/passwd /test

# cp /etc/hosts /test

# mkdir /test/dir01

# cp /etc/group /test/dir01

# cp /etc/dumpadm.conf /test/dir01

 

grep 명령어 사용

grep 명령어의 -l 옵션을 사용하면 지정된 위치의 디렉토리 바로 아래에 파일들에서만 찾을려는 패턴을 검색할수 있다.

 

# grep -l "solarisXXX" /test/*

/test/hosts

 

find 명령어 사용

find 명령어와 xargs 명령어를 함께 사용하게 되면 지정된 디렉토리 하위의 모든 파일에서 찾을려는 패턴이 들어 있는 파일을 검색할 수 있다.

 

# find /test -type f | xargs grep "solarisXXX"

/test/hosts:172.16.8.200 solaris200 solaris200.example.com loghost

/test/dir01/dumpadm.conf:DUMPADM_SAVDIR=/var/crash/solaris200

 

() # CMD1 | xargs CMD2

CMD1 명령어의 출력 결과를 xargs 명령어가 CMD2 명령어의 인자로 넘겨준다.

 

# find /test -type f | xargs grep "solarisXXX" | awk -F: '{print $1}'

/test/hosts

/test/dir01/dumpadm.conf

 

 

 

 

(2). 정규화된 표현식

 

grep 명령어는 검색 패턴을 좀더 정확히 정의할 수 있도록 다양한 정규표현식 메타문자를 지원한다. 뿐만 아니라 다양한 검색 및 출력 방법을 저정할 수 있는 옵션들도 제공하고 있다. (메타문자: ;, &, ( ), |, < >)

 

메타문자

기능

사용예

사용 예 설명

^

행의 시작 지시자

‘^root'

root로 시작하는 모든 행과 대응

$

행의 끝 지시자

'root$'

root로 끝나는 모든 행과 대응

.

하나의 문자와 대응

'a...n'

a 다음 3글자가 나오고 n으로 끝나는 문자열을 포함하는 행과 대응

*

선행문자와 같은 문자의 0개 혹은 임의개수와 대응

'*love'

0개 혹은 임의 개수의 공백 문자후에 love로 끝나는 문자열을 포함한 행과 대응

[ ]

[ ] 사이의 문자 집합 중 하나와 대응

'[Nn]obody'

Nobody, nobody를 포함하는 행과 대응

[^]

문자집합에 속하지 않는 한 문자와 대용

'[^A-k]ove'

A부터 K문자사이에 포함되지 않는 한문자와 ove가 붙어있는 문자열과 대용

<

단어의 시작 지시자

'<love'

love로 시작하는 단어를 포함하는 행과 대응

>

단어의 끝 지시자

'love>'

love로 끝나는 단어를 포함하는 행과 대응

(..)

다음 사용을 위해 태크를 붙인다.

'(lov)ing

지정된 부분을 태크1에 저장한다. 나중에 태크값을 참고하려면 1을 쓴다. 맨 왼쪽부터 시작해 태크를 9개까지 쓸수 있다. 왼쪽 예에서는 lov가 레지스터 1에 저장되고 나중에 1로 참고할 수 있다.

 

 

 

[EX1] 정규표현식: ^string

/etc/passwd 파일에서 root로 시작하는 문자열을 포함하는 라인을 출력한다.

 

# grep '^root' /etc/passwd

root:x:0:0:Super-User:/:/bin/ksh

 

# ls -l | grep '^-' /* 현재 디렉토리안에 일반 파일만 출력 */

-rw-r--r-- 1 root root 1824 Dec 8 23:58 file.jar

-rw-r--r-- 1 root root 762 Dec 9 00:00 file1

-rw-r--r-- 1 root root 762 Dec 9 00:00 file2

-rw-r--r-- 1 root root 762 Dec 9 00:00 file3

 

# ls -l | grep '^d' /* 현재 디렉토리안에 디렉토리 파일만 출력 */

drwxr-xr-x 2 root root 2 Dec 22 06:53 dir1

drwxr-xr-x 2 root root 2 Dec 22 06:53 dir2

drwxr-xr-x 2 root root 2 Dec 22 06:53 dir3

 

 

 

[EX2] 정규표현식: string$

/etc/group 파일에서 root로 끝나는 문자열을 포함하는 라인을 출력한다.

 

# grep 'root$' /etc/group

other::1:root

uucp::5:root

mail::6:root

nuucp::9:root

daemon::12:root

 

 

 

[EX3] 정규표현식: Ad..n

/etc/passwd 파일에서 Ad로 시작하고 2개의 문자가 있으며 n문자로 끝나는 문자열이 포함된 라인을 출력한다.

 

# grep 'Ad..n' /etc/passwd

adm:x:4:4:Admin:/var/adm:

lp:x:71:8:Line Printer Admin:/usr/spool/lp:

uucp:x:5:5:uucp Admin:/usr/lib/uucp:

nuucp:x:9:9:uucp Admin:/var/spool/uucppublic:/usr/lib/uucp/uucico

listen:x:37:4:Network Admin:/usr/net/nls:

 

 

 

[EX4] 정규표현식: r*t

r로 시작하여 t로 끝나는 문자열을 포함하는 라인들을 출력한다.

 

# grep 'r*t' /etc/group

root::0:

other::1:root

bin::2:root,daemon

sys::3:root,bin,adm

adm::4:root,daemon

uucp::5:root

mail::6:root

tty::7:root,adm

lp::8:root,adm

nuucp::9:root

staff::10:

daemon::12:root

postgres::90:

 

 

 

[EX5] 정규표현식: [n-u]*cp

/etc/passwd 파일에서 n부터 u문자까지의 한글자와 뒤에 cp문자열이 포함된 라인을 출력한다.

 

# grep '[n-u]*cp' /etc/passwd

uucp:x:5:5:uucp Admin:/usr/lib/uucp:

nuucp:x:9:9:uucp Admin:/var/spool/uucppublic:/usr/lib/uucp/uucico

 

 

 

[EX6] 정규표현식: <string

/etc/group 파일에서 uucp로 시작하는 단어를 포함하는 라인을 출력한다.

 

# grep '<uucp' /etc/group

uucp::5:root,uucp

 

 

 

[EX7] 정규표현식: <string>

/etc/system 파일에서 The 문자열이 포함된 라인을 출력한다.

 

# grep '<The>' /etc/system (# grep -w 'The' /etc/system)

* it tries the second and so on. The default is /kernel /usr/kernel

* The following may be used to override the defaults provided by

* expanded physical pathname. The default is the

* program resides. The physical pathname is

 

 

 

[EX8] 정규표현식: (..)

숫자 3, 마침표, 임의의 한 숫자, 임의 개수의 문자(.*), 숫자 3(태그), 따라서, 임의 개수의 탭 문자, 숫자 3의 순서를 갖는 문자열이 포함된 모든 행을 출력한다. 숫자 3은 괄호에 쌓여 있기 때문에 나중에 1( ) 안에 지정한 첫 번째 태크를 의미한다.

 

# grep '(3).[0-9].*1 *` datafile

northwest NW charles Main 3.0 .98 3 34

[참고] grep 명령어에서 변수를 사용하기 위해서

 

grep 명령어에서 찾을려고하는 패턴을 지정하는 경우 쉘스크립트 안에서 사용하는 경우, 찾을려고 하는 패턴 부분에 변수를 지정해야 하는 경우가 있다면, 작은 따옴표('')를 사용하지 말고 큰 따옴표("")를 사용해야 한다.

 

# cat grep.sh

---------------------------------------------------------------------

#!/bin/ksh

 

PATTERN=root

grep "$PATTERN" /etc/passwd

 

..... (중략) .....

---------------------------------------------------------------------