9. 도서관/__다. UNIX

grep 과 tail 사용법

행복 금융 2008. 8. 14.






# grep 명령어 


grep : 파일 전체를 검색해서 정규 표현식에 대응하는 모든 행들을 출력한다.
       ( 특정 파일내에서 사용자가 지정한 패턴을 포함한 문장을 찾아 출력해 주는 프로그램 )

egrep : extended grep, grep의 확장판으로 추가 정규 표현식, 메타 문자를 지원한다.
fgrep : fixed character gerp, fast grep, 모든 문자를 문자 그대로 취급한다. 즉, 정규 표현식의 메타 문자도 일반 문자로 취급한다.

사용법
grep [옵션]... 패턴 [파일] ...
Search for PATTERN in each FILE or standard input.
Example: grep -i 'hello world' menu.h main.c


grep에서 사용하는 정규 표현식 메타 문자


메타 문자 / 기능 / 사용 예 / 사용 예 설명
^ / 행의 시작 시시자 / '^love' / love로 시작하는 모든 행과 대응
$ / 행의 끝 지시자 / 'love$' / love로 끝나는 모든 행과 대응
. / 하나의 문자와 대응 / 'l..e' / l 다음에 두 글자가 나오고 e로 끝나는 문자열을 포함하는 행과 대응
[] / [] 사이의 문자 집합 중 하나와 대응 / '[Ll]ove' / Love나 love를 포함하는 행과 대응
[^] / 문자 집합에 속하지 않는 한 문자와 대응 / '[^A-K]ove / A와 K 사이의 범위에 포함되지 않는 한 문자와 ove가 붙어있는 문자열과 대응

grep 옵션
-c : 일치하는 행의 총 수를 출력한다(count).
-h : 파일 이름을 출력하지 않는다.
-i : 대소문자를 구분하지 않는다(ignore).
-l : 패턴이 존재하는 파일의 이름만 출력한다(list file).
-n : 파일 내에 행 번호를 함께 출력한다(number).
-v : 패턴이 존재하지 않는 행만 출력한다(invert).
-w : 단어 단위로 찾는다(word).




※ tail 명령어


- man tail 시 화면
---------------------------------------------------------------------------------------------------------------------------
TAIL(1)                                                                          User Commands                                                                          TAIL(1)

NAME
       tail - output the last part of files

SYNOPSIS
       tail [OPTION]... [FILE]...

DESCRIPTION
       Print  the  last  10 lines of each FILE to standard output.  With more than one FILE, precede each with a header giving the file name.  With no FILE, or when FILE is -,
       read standard input.

       Mandatory arguments to long options are mandatory for short options too.

       --retry
              keep trying to open a file even if it is inaccessible when tail starts or if it becomes inaccessible later -- useful only with -f

       -c, --bytes=N
              output the last N bytes

       -f, --follow[={name|descriptor}]
              output appended data as the file grows; -f, --follow, and --follow=descriptor are equivalent

       -F     same as --follow=name --retry

       -n, --lines=N
              output the last N lines, instead of the last 10

       --max-unchanged-stats=N
              with --follow=name, reopen a FILE which has not changed size after N (default 5) iterations to see if it has been unlinked or renamed (this is the usual case  of
              rotated log files)

       --pid=PID
              with -f, terminate after process ID, PID dies

       -q, --quiet, --silent
              never output headers giving file names

       -s, --sleep-interval=S
              with -f, sleep for approximately S seconds (default 1.0) between iterations.

       -v, --verbose
              always output headers giving file names

       --help display this help and exit

       --version
              output version information and exit

       If the first character of N (the number of bytes or lines) is a ?? print beginning with the Nth item from the start of each file, otherwise, print the last N items in
       the file.  N may have a multiplier suffix: b 512, k 1024, m 1024*1024.

       With --follow (-f), tail defaults to following the file descriptor, which means that even if a tail?d file is renamed, tail will  continue  to  track  its  end.   This
       default  behavior  is  not desirable when you really want to track the actual name of the file, not the file descriptor (e.g., log rotation).  Use --follow=name in that
       case.  That causes tail to track the named file by reopening it periodically to see if it has been removed and recreated by some other program.
---------------------------------------------------------------------------------------------------------------------------



[ tail 명령어 활용 ]


- 파일의 뒷부분을 지정된 만큼 보여주는 명령어
  (binary 파일도 실행이 되지만, 그 내용을 알아보기 힘드므로, 보통 텍스트로된 파일에 사용)

- tail의 반대명령어 <-> head  : (앞에서 부터 보여주는 명령어)



# 자주쓰는 옵션들


1) -f : output appended data as the file grows

가장 많이 사용하는 옵션으로는 -f 가 있는데 기본적으로 끝에서 10 줄까지를 보여준다.
계속 크기가 변하는 파일을 모니터링 할때 유용하다. (ex 해당파일의 로그가 변화는 걸 계속 확인할 때)

ex) tail -f db.log


2) -n : output the last N lines, instead of the last 10

tail 명령어에서 두번째로 많이 쓰는 옵션은 -n 일 것이다.
-n 옵션은 원하는 수 라인 만큼 값을 출력하는 것이다. ( -c 는 bytes 만큼 출력의미 )


- 아무 옵션없이 파일이름만 준 경우

ex) tail a.log
    (a.log 파일의 마지막부터 10행까지만 보여준다.)


- 마지막부터 원하는 행의 수 만큼 보여줄 경우

ex) tail -n 5 a.log
    (a.log의 마지막부분부터 5행만큼 보여준다.)


- 파일의 특정 행부터 마지막행까지 보여줄 경우

ex) tail +5 a.log
   (a.log의 5행부터 마지막까지 보여준다.)



# 해당 파일명에서 검색어가 포함된 라인 보여주기


- tail -f 파일명 | grep 검색어 

ex) tail -f login_disc_20060503.dat | grep I6

(grep 또는 egrep 명령은 모두 한 라인을 대상으로 하여 특정 패턴을 매칭시킨다)



# 두 라인 이상을 보고자 할 경우 (egrep을 사용한다.)

ex) tail -f 20050711.log | egrep '(POP3|logged in)' > 20050711_pop3.log

로그 예)
==========================================================================
[1110232:00004-00772] 2005/07/11 01:55:29 PM  POP3 Server:
김길동 /  logged in
[1110232:00004-00772] 2005/07/11 01:55:29 PM  POP3 Server: 172.21.42.44
disconnected
==========================================================================


-  egrep으로 or 검색은 되지만 and 검색은 pipe로 한다.


- ABC와 XYZ 가 포함되어 있는 라인을 검색하려면, (AND 검색)
ex) egrep "ABC" *.dat | egrep "XYZ"


- ABC가 포함되어 있거나 XYZ가 포함되어 있는 라인을 검색하려면, (OR 검색)
ex) egrep "ABC|XYZ" *.dat


- ABC는 포함되어 있지만 XYZ가 없는 라인을 검색하려면,
ex) egrep "ABC" *.dat | egrep -v "XYZ"





egrep -v '^$' abc.txt 

설명)  이 명령은 abc.txt라는 파일에서 ^$ 이라는 패턴이 포함되지 않는 문장을 찾아 출력하는 것입니다.
-v 옵션이 지정한 패턴을 제외한 나머지라는 의미를 가지고 있습니다.

^는 앞에서 문장의 시작이라고 말씀드렸고 $는 문장의 끝이라고 설명해 드렸습니다.
따라서 ^$는 문장의 시작이 오고 다음에 문장이 끝이 오는 패턴 즉 공백문자열을 의미합니다.

결국 위 명령은 abc.txt에서 공백라인을 제거하고 출력하라는 의미를 가지게 됩니다.


egrep '^my name' abc.txt

설명) 이 명령은 abc.txt라는 파일에서 '^my name'라는 패턴을 찾는 것입니다.

지정한 패턴은 문장의 시작이 오고 그 뒤로 차례대로 m,y,공백,n,a,m,e가 오는 패턴입니다.

결국 my name 으로 시작하는 문장을 의미한다고 봐도 무방합니다.

따라서 위 명령은 abc.txt.라는 파일에서 my name으로 시작하는 문장을 찾아 출력하라는 의미를 가지게 됩니다.

my name is chiwoo 와 같은 문장이 이런 패턴과 일치하게 됩니다.


egrep 'naver$' abc.txt

설명) 이 명령은 abc.txt라는 파일에서 'naver$'라는 패턴이 포함되어 있는 문장을 찾아 출력하는 것입니다.
지정한 패턴은 차례대로 n,a,v,e,r,문장의 끝이 오는 패턴입니다.

결국 위 명령은 naver로 끝나는 문장을 찾아 출력하라는 의미를 가지게 됩니다.

my favorite mail site is the naver 와 같은 문장이 이런 패턴에 해당하겠죠.


egrep '(abc|def)$'  test.txt  하시면 됩니다.

이렇게 하면 test.txt에 포함되어 있는 라인 중 abc 또는 def로 끝나는 라인을 모두 찾아서 출력해 줍니다.

질문에 'abc로 끝나는 파일' 이라는 표현을 쓰셨는데,
grep이나 egrep은 입력된 문자열 또는 입력파일내 문자열에서 지정한 패턴을 포함한 라인을 찾아서 출력해 주는 프로그램이구요, 
만약 ls와 egrep을 이용하여 파일의 이름 중 abc 또는 def로 끝나는 파일을 찾고자 하시는 것이라면 다음과 같이 하시면 됩니다.


ls -1 | egrep '(abc|def)$'

위에서 -1은 숫자 1입니다. 한라인에 파일 이름 하나씩 출력하라는 의미죠.



egrep '^naver$' abc.txt

설명) 위 명령은  차례대로 문장의시작,n,a,v,e,r,문장의끝이 오는 패턴을 포함하는 문장을 찾아 출력하라는 의미를 가지고 있습니다.

결국 naver라는 한 단어로 이루어진 문장만을 찾아 출력하게 되겠죠.

예를들면..

naver         <== 이건 패턴과 일치합니다.

naver naver   <== 이건 패턴과 일치하지 않습니다.

[출처] grep 과 tail 사용법 |작성자 민석





'9. 도서관 > __다. UNIX' 카테고리의 다른 글

dd disk dump 에 관하여..  (0) 2008.09.08
.cshrc  (0) 2008.08.21
Unix/Linux 해킹 피해 시스템 분석 절차  (0) 2008.08.05
fsck 자세히 알기 조회  (0) 2008.07.30
부팅불가시  (0) 2008.07.30

댓글

💲 추천 글