[Linux] grep 명령어 사용법

grep 명령어 사용법
 


출처 : 유닉스 쉘 바이블 (엘리 퀴클리 지음)에서 발췌.

3.1 grep 명령어

grep : 파일 전체를 뒤져 정규표현식에 대응하는 모든 행들을 출력한다.
egrep : grep의 확장판으로, 추가 정규표현식 메타문자들을 지원한다.
fgrep : fixed grep 이나 fast grep으로 불리며, 모든 문자를 문자 그래도 취급한다. 즉, 정규표현식의 메타문자도 일반 문자로 취급한다.

3.2 정규표현식을 사용하는 grep의 예제
# grep NW datafile
# grep NW d* (d로 시작하는 모든 파일에서 NW를 포함하는 모든 행을 찾는다.)
# grep '^n' datafile (n으로 시작하는 모든 행을 출력한다.)
# grep '4$' datafile (4로 끝나는 모든 행을 출력한다.)
# grep TB Savage datafile (TB만 인자이고 Savage와 datafile은 파일 이름이다.)
# grep 'TB Savage' datafile (TB Savage를 포함하는 모든 행을 출력한다.)
# grep '5.' datafile (숫자 5, 마침표, 임의의 한 문자가 순서대로 나타나는 문자열이 포함된 행을 출력한다.)
# grep '.5' datafile (.5가 나오는 모든 행을 출력한다.)
# grep '^[we]' datafile (w나 e로 시작하는 모든 행을 출력한다.)
# grep '[^0-9]' datafile (숫자가 아닌 문자를 하나라도 포함하는 모든 행을 출력한다.)
# grep '[A-Z][A-Z] [A-Z]' datafile (대문자 2개와 공백 1개, 그리고 대문자 하나가 연이어 나오는 문자열이 포함된 행을 출력한다.)
# grep 'ss* ' datafile (s가 한 번 나오고, 다시 s가 0번 또는 여러번 나온 후에 공백이 연이어 등장하는 문자열을 포함한 모든 행을 출력한다.)
# grep '[a-z]{9}' datafile (소문자가 9번 이상 반복되는 문자열을 포함하는 모든 행을 출력한다.)
# grep '(3).[0-9].*1 *1' datafile (숫자 3,마침표,임의의 한 숫자,임의 개수의 문자,숫자 3(태그),임의 개수의 탭 문자,숫자 3의 순서를 갖는 문자열이 포한된 모든 행을 출력한다.)
# grep '
(north로 시작하는 단어가 포함된 모든 행을 출력한다.)
# grep '' datafile (north라는 단어가 포함된 모든 행을 출력한다.)
# grep '<[a-z].*n>' datafile (소문자 하나로 시작하고, 이어서 임의 개수의 여러 문자가 나오며, n으로 끝나는 단어가 포함된 모든 행을 출력한다. 여기서 .*는 공백을 포함한 임의의 문자들을 의미한다.)

3.3 grep에 옵션 사용
# grep -n '^south' datafile (행번호를 함께 출력한다.)
# grep -i 'pat' datafile (대소문자를 구별하지 않게 한다.)
# grep -v 'Suan Chin' datafile (문자열 Suan Chin이 포함되지 않은 모든 행을 출력하게 한다. 이 옵션은 입력 파일에서 특정 내용의 입력을 삭제하는데 쓰인다.
# grep -v 'Suan Chin' datafile > black
# mv black datafile
# grep -l 'SE' * (패턴이 찾아진 파일의 행 번호 대신 단지 파일이름만 출력한다.)
# grep -w 'north' datafile (패턴이 다른 단어의 일부가 아닌 하나의 단어가 되는 경우만 찾는다. northwest나 northeast 등의 단어가 아니라, north라는 단어가 포함된 행만 출력한다.)
# grep -i "$LOGNAME" datafile (환경변수인 LOGNAME의 값을 가진 모든 행을 출력한다. 변수가 큰따옴표로 둘러싸여 있는 경우, 쉘은 변수의 값으로 치환한다. 작은따옴표로 둘러싸여 있으면 변수 치환이 일어나지 않고 그냥 $LOGNAME 이라는 문자로 출력된다.)

3.4 egrep
egrep(extended grep) : grep에서 제공하지 않는 확장된 정규표현식 메타문자를 지원  한다. grep와 동일한 명령행 옵션을 지원한다.

3.4.1 egrep 예제
# egrep 'NW|EA' datafile (NW나 EA가 포함된 행을 출력한다.)
# egrep '3+' datafile (숫자 3이 한 번 이상 등장하는 행을 출력한다.)
# egrep '2.?[0-9]' datafile (숫자 2 다음에 마침표가 없거나 한 번 나오고, 다시 숫자가 오는 행을 출력한다.)
# egrep ' (no)+' datafile (패턴 no가 한 번 이상 연속해서 나오는 행을 출력한다.)
# egrep 'S(h|u)' datafile (문자 S 다음에 h나 u가 나오는 행을 출력한다.)
# egrep 'Sh|u' datafile (패턴 Sh나 u를 포함한 행을 출력한다.)

3.5 고정 grep 과 빠른 grep
fgrep : grep 명령어와 동일하게 동작한다. 다만 정규표현식 메타문자들을 특별하게 취급하지 않는다.
# fgrep '[A-Z]****[0-9]..$5.00' file ([A-Z]****[0-9]..$5.00 이 포함된 행을 출력한다. 모든 문자들을 문자 자체로만 취급한다.)

 


질문하신분이 있어 추가로 기록합니다.


질문 : 


grep : 파일 전체를 뒤져 정규표현식에 대응하는 모든 행들을 출력한다. 
라고 되어 있는데
혹시 XXmenu, 00menu, **menu 가 어느 파일에 있을 경우
menu만 단어로 해서 그 해당하는 행이 전체가 나오지 않고
XXmenu, 00menu, **menu 만 나오게 할 수는 없는가요?



grep정규식은 아래와같이 표현할 수 있겠네요

grep -n "[0-9|a-Z]\{2\}menu" target.txt

18:11menu

20:asdfasdf xxmenu asdfasdfas

22:asdfasadf99menuasdfasgeafdsa

23:asdfmenusdafasdfasdf

____________________________________________________________________________

target.txt :

sdf

asdfasdg

asdfasdgdfa

sdfa




asdfasdgdfasdf



asf

d


asdfasdg




11menu

asdfasd

asdfasdf xxmenu asdfasdfas

124124512

asdfasadf99menuasdfasgeafdsa

asdfmenusdafasdfasdf

____________________________________________________________________________


하지만 결과가 원하는 결과가 아니죠? 


이부분을 해결하는 방법이야 많겠지만

제가 생각하는 방법은


grep보다는 sed 를 이용해서 해당부분을 뽑아내는방법이 더 편리할 것 같네요

grep의 사용이든 뭐든 중요한건 정규식을 어떻게 구성하느냐 겠죠


뭐 이런 정도의 txt파일이 있을때


먼저 설명드린 정규식과 파일파라미터를 얻는 부분을 shell script로 만드셔서 실행하시면 될겁니다.


find /TARGET_PATH | while read VAR


#hereafter just print saved filename

do

echo $VAR

done

뭐대충 이런식으로 수집된 파일목록들을 대상으로 grep수행해주시면 되겠네요.



결과적으로 script 내용은 뭐 대충 이렇게 되겠네요


____________________________________________________________________________

#!/bin/bash


find . -type f | while read VAR

do

echo ${VAR}


temp=$(sed -n 's/.*\([0-9|a-Z]\{2\}menu\).*/\1/p' ${VAR})

for i in $temp

do

echo $i

done


done

____________________________________________________________________________




실행결과는 


____________________________________________________________________________

ubuntu:~/workspace$ ./search.sh

./search.sh

./search.sh~

./target.txt

11menu

xxmenu

99menu

dfmenu

____________________________________________________________________________


temp에 **menu list들을 각 파일마다 가져와서 저장합니다. 이걸 어떻게 쓸지는 질문하신분의 몫입니다. :)



역슬레쉬('\')때문에 보시기 어려우시면 역슬레쉬부분을 지우고 보시면 한결 보기 편하실 겁니다.

by NeoTrinity | 2008/10/16 10:57 | My Linux Life | 트랙백(1) | 핑백(3) | 덧글(4)

트랙백 주소 : http://NeoTrinity.egloos.com/tb/961862
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Tracked from at 2014/03/11 00:25

제목 : natural garcinia cambogia
line1...more

Linked at 이동통신, 그리고 나의 가족 .. at 2011/06/17 10:25

... http://neotrinity.egloos.com/961862 ... more

Linked at 공부가 본업. : 여러 개 파.. at 2012/07/30 22:43

... 여러 개 파일 붙이기 scripthttp://darkrang.tistory.com/140 위와 관련은 없지만, 같이 본 글들 grep 기본 설명 조금http://neotrinity.egloos.com/961862 shell script에서 array 사용 방법http://wiki.kldp.org/HOWTO/html/Adv-Bash-Scr-HOWTO/arr ... more

Linked at grep 명령어 at 2013/03/16 19:56

... http://neotrinity.egloos.com/961862</a> <a href="http://neotrinity.egloos.com/961862"></a>3.1 grep 명령어 grep : 파일 전체를 뒤져 정규표현식에 대응하는 모든 행들을 출력한다.egrep : grep의 확장판으로, 추가 정규표현식 메타문자들을 지원한다.fgrep : fixed grep 이나 fast grep으로 불리며, 모든 문자를 문자 그래도 취급한다. 즉, 정규표현식의 ... more

Commented by 지나가는 이 at 2011/04/06 01:57
감사합니다!
Commented by NeoTrinity at 2011/04/06 01:58
별말씀을요..ㅋ
Commented by 궁금한게 있는 이 at 2013/12/26 17:03
grep : 파일 전체를 뒤져 정규표현식에 대응하는 모든 행들을 출력한다.
라고 되어 있는데
혹시 XXmenu, 00menu, **menu 가 어느 파일에 있을 경우
menu만 단어로 해서 그 해당하는 행이 전체가 나오지 않고
XXmenu, 00menu, **menu 만 나오게 할 수는 없는가요?
Commented by NeoTrinity at 2015/06/01 16:13
본문에 해당내용을 추가했습니다 한번 보세요~

:         :

:

비공개 덧글

◀ 이전 페이지 다음 페이지 ▶