본문 바로가기

별걸다하는 IT/리눅스 유닉스

[리눅스]텍스트 필터 명령어1(문자열 패턴 검색 grep 옵션, 정규표현식)

[리눅스 Linux]

리눅스 완전 정복 : 리눅스 목차


FILTER


필터링! 많이 들어보셨죠?

욕을 필터링한다고 하면 욕을 걸러준다는 거고

정수기 필터,,, 에어콘 필터,, 

실생활에서도 필터링은 많이 사용되서 뜻은 아실거라 생각해요!

필터 명령어라는건 말그대로 필요한 것만 걸러주는 명령어를 말합니다.





필터링 명령어들은 다음 장에서 배울 파이프와 아주 찰떡처럼 자주 쓰인답니다.

참고로 우리가 기본 명령어 포스팅에서 배운 head와 tail도 문서 중 내가 원하는 앞/뒷 부분만 발췌해주는 거기 때문에 사실 필터 명령어예요. 자주 쓰이는 다른 필터링 명령어들을 배워볼게요


사실 필터 명령어로는 head, tail, grep, sort, wc, awk, sed, cut..등등 많이 있어요 앞으로 차근 차근 하나씩 알아갈겁니다 ~♡


grep (Global Regular Expression Print)

grep 명령은 파일 내에서 지정한 패턴이나 문자열을 찾은 후에 그 패턴을 포함하고 있는 모든 행을 표준 출력해줍니다. 물론 한 디렉터리 내에서 지정한 패턴을 포함하는 파일을 출력할 수도 있어요. grep 명령은 하나 이상의 파일로부터 프로그램 수정 등을 위해 변수, 또는 함수명을 찾을 때 많이 사용되므로 꼭 알아둡시다. 대단히 유용한 명령어예요 ㅎㅎ


grep

- 텍스트 파일에서 특정 패턴(문자열)을 갖는 줄을 찾아서 출력해주는 명령어

$ grep [option] pattern file(s)



옵션

 옵션

 의미 

 -a 

 grep은 바이너리파일은 처리할 수 없다. binary파일을 텍스트파일처럼 처리할 수 있게 해주는 옵션 

 -b 

 패턴과 일치하는 줄의 시작점을 출력한다. (--byte-offset)

 -c 

 패턴과 일치하는 줄의 개수를 출력한다 (--count)  

 -h 

 여러 개의 파일을 검색 시 출력하는 파일의 이름이 붙는 것을 방지한다. 

 -i 

 검색할 때 대소문자를 구분하지 않는다 (--ignore-case) (-y) 

 -n 

 패턴과 일치하는 줄의 번호와 내용을 같이 출력한다 

 -v 

 패턴과 일치하지 않는 줄을 출력한다 (--invert-match) 

 -w 

 패턴과 한 단어로 일치해야 출력한다 (--word-regexp)

 -x

 패턴과 한 줄로 일치해야 출력한다. 

 -l 

 주어진 패턴과 일치하는 패턴이 있는 파일의 이름만 출력한다 

 -r 

 하위 디렉터리까지 주어진 패턴을 찾는다

 -o 

 지정한 패턴과 매칭되는 것만 출력한다 (--only-matching) 

 -E

 보통 grep은 하나의 패턴만을 검색하는 데, 이 옵션은 |와 연계하여 여러 패턴을 찾는다. 

 egrep 명령과 같다 

 -F 

 지정한 문자들, 특히 특수문자(, *등)를 기호 그대로 인식하여 출력해준다. 

 fgrep명령과 같다. 

대소문자를 구분하지 않는 -i, 

매치하는 행 수만을 리턴하여 갯수를 확인할 때 쓰는 -c

단어 단위로 패턴을 검색하는 -w 옵션 등이 자주 쓰입니다.


$ grep -c linux *

-> 현재 디렉터리의 모든 파일들이 'linux'라는 문자열이 들어있는 줄을 몇 개씩 가지고 있는지를 보여줍니다.


$ grep -h linux *

-> 현재 디렉터리에 있는 모든 파일 중에서 'linux'라는 문자열이 들어있는 줄을 출력하는데 파일명은 출력하지 않는다.


grep 패턴* 

현재 디렉터리에서 해당 문자열이 들어 있는 파일을 찾아서 그 문자열이 들어가 있는 라인(행)을 화면에 출력합니다 (서브 디렉터리까지 검색하기 위해서는 위 옵션에서 언급하는 바와 같이 -r옵션을 주어야 합니다)

$ grep linux *

-> 현재 디렉터리의 모든 파일에서 'linux'라는 문자열이 들어가 있는 줄을 찾아 출력한다.


이렇게 문자열을 직접적으로 넣어서 찾을 수도 있지만

고정 문자열이 아닌 특정 패턴을 가진 문자열을 찾고 싶을 때는 정규식을 사용합니다.

정규식은 grep뿐만 아니라 다른 명령어에서도 또는 다른 언어에서도 자주 반복되므로 꼭 머리속에 넣어둡시다.


---정규식(regular expression)---

 메타문자

 기능 

 예시 

 예 설명 

 ^

 행의 시작 지시자 

 '^hello' 

 hello로 시작하는 모든 행 

 $ 

 행의 끝 지시자  

 'hello$' 

 hello로 끝나는 모든 행 

 .

 a single character 

 하나의 문자와 대응  

 'h...o' 

 h와 o사이에 딱 세 글자가 있어야 함 

 ? (egrep)

 the preceding character matches 

 0 or more 1 times only

 앞 문자가 0 또는 한개로 된 것을 의미

 'hel?o'

 hello, helo 등을 검색 

 .* 

 Nothing or any number of charaters

 0이거나 그 이상의 문자 (=all)

 'hel*o'

 helo, helao, helfdfadfo 등 검색

 *

 zero or more occurrences of 

 the previous character

 셸 상태에서의 *와 다르게 정규표현식에서 

 *는 바로 앞 문자와 연계되어 있다. 

 앞 문자가 하나이거나 반복되어진 것을 의미

 'hel*o'

 helo, hello, helllo, hellllo 등을 

 검색함.

 | (egrep)

 pipe 기호랑 똑같은 기호.

 |가 정규식에서 사용되면 or(또는)이라는 뜻을 가짐 

 'or|is|go'

 oranges, Lisa, mangoes 등등 

 셋 중 하나라도 들어있으면 검색함 

 []

 []는 문자 리스트 중의 한 문자를 나타낸다.

 'New[abc]'

 Newa, Newb, Newc 등을 검색함 

 [0-9]

 0,1,2,3,4,5,6,7,8 또는 9

 '[0-9]'

 0,1,2,3,4,5,6,7,8 또는 9

 [^]

 []안에 들어가면 ^는 not 즉 제외의 의미를 갖는다.

 '[^1-3]'

 1,2,3을 제외한 모든 문자

 1,2,3으로 조합하지 않은 문자가 하나라도 있는 경우 

 \

 Ignores the special meaning of the 

 character following it.

 지정문자 특징같은거 무시해준다 

 'New\.\[abc\]'

 New.[abc]와 같은 말을 찾는다

 .이나 []의 패턴식을 무시하고 문자 그대로를 의미한다.

 \<

 단어의 시작 지시자 

 '\<hello'

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

 \>

 단어의 끝 지시자 

 'hello\>' 

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

 x\{m\}

 문자 x를 m번 반복한다  

 'o\{5w}' 

 문자 o가 5회 연속적으로 나오는 모든 행과 대응 

 x\{m,\}

 적어도 m번 반복한다.  

 'o\{5,\}' 

 문자 o가 최소한 5회 반복되는 모든 행과 대응 


익숙해지기 위한 연습 문제들~


$ grep "[aA]g[ar][ar]wal" filename

--> Agarwal, Agaawal, Agrawal, Agrrwal, agarwal, agaawal, agrawal, agrrwal 등을 찾아요


$ grep notepad d*

-> d로 시작하는 모든 파일에서 notepad를 포함하는 모든 행을 찾습니다.


$ grep [a-d] 파일명

-> 파일에서 a,b,c,d로 시작하는 단어를 찾습니다.


$ grep '^[ab]' 파일명

--> 파일에서 a나 b로 시작되는 모든 행을 찾습니다.


$ grep '[^ab]' 파일명

--> 파일에서 a나 b가 들어있지 않은 행


$ grep "[0-9]" readme 

-> readme 파일에서 숫자가 존재하는 줄을 출력합니다.


$ grep 'app*' 파일명

-> 파일에서 app로 시작하는 모든 단어를 찾습니다.


$ grep 'aa*' datafile

-> a가 한 번 나오고, 다시 a가 0번 또는 여러번 나온 후에 공백이 연이어 등장하는 문자열을 포함한 모든 행을 출력합니다.


$ grep -v ^# /etc/vsftpd/vsftpd.conf

-> /etc/vsftpd/vsftpd.conf 파일에서 #으로 시작하지 않는 줄만 출력해줘요.


$ grep '\.5' file.txt

-> '.5'가 나오는 모든 행을 출력한다.


$ grep "S\.K\.Kumar" file.txt

-> S.K.Kumar 를 file.txt에서 찾습니다.


$ grep '\<[a-z].*n\>' file.txt

-> 소문자 하나로 시작하고(\<[a-z]), 이어서 공백을 포함한 임의 개수의 여러 문자가 나오며(.*), n으로 끝나는 단어가 포함된 모든 행을 출력한다.


하나의 예시?

어느날, 우리가 매일 쓰는 노트북이 어떤 프로세스를 수행하고 있는지 궁금해서 확인하려고 한다 생각할게요



작업관리자에서 프로세스 리스트를 보면 와.. 저기 스크롤 크기 보이나요? 수백개의 리스트가 나와요 ㅎ

리눅스도 운영체제이다보니 우리가 프로그램을 다운받고 이것저것 사용하다보면 이렇게 많은 프로세스를 수행하게 되겠죠?

만약 이 중 특정 프로세스 정보를 알아야 하는 경우, 

한 예로 웹 개발을 하는데 톰캣 서버가 뻑나서 이 톰캣서버의 PID를 알아내 강제종료 하려고 해요 (다들 한 번쯤 겪어만한..ㅎㅎ 특히 피보탈서버..ㅎㅎ 왜 자꾸 뻑난건지..)

그럼 이 프로세스를 이 수많은 목록을 보면 서 일일이 찾으려면 너무 힘들거예요.

이럴 때 grep 명령어를 사용해서 알아낼 수 있습니다.


# ps aux

명령어의 검색 결과예요. 나중에 배우겠지만 ps는 현재 실행되고 있는 프로세스의 상태를 확인할 때 사용하는 명령어입니다. aux는 옵션이예요. 

이렇게 많은 프로세스 말고 내가 알고 싶은 프로세스 설명만 볼 수는 없을까?


# ps aux | grep "tomcat"

(톰캣 프로세스가 돌아가고 있는지 알고 싶을 경우)


이 상황은 하나의 예시일 뿐이예요. grep의 유용성은 엄청나답니다.ㅎㅎ 


오늘은 여기까지

도움이 되었다면 공감과 댓글 꾸욱~