본문 바로가기

OS/Linux

#08. grep/egrep, awk

이번소개에서는 grep/egrep과 awk에 대해 소개해드리겠습니다.

오늘 소개할 두개의 기능은 linux에서 아주 편리한 기능으로 많이쓰입니다.

먼저 grep/egrep부터 소개해드릴께요.



1.grep/egrep

grep과 egrep의 차이는 거의 없다고 보시면되요. 단지 egrep은 grep의 확장 버전으로 grep보단 egrep을 써야 더욱 많은 정규표현식을 사용할수있습니다. 소개할땐 주로 egrep으로 소개 해드릴텐데요, grep을쓰시고 싶으신분들은 그냥 grep으로 바꿔 쓰시면됩니다. grep에서 쓰일수없는 정규표현식은 바로전에 소개해드린 정규표현식(#07)을 보시면 아실수있습니다!


egrep [옵션] '정규표현식'/패턴 [경로]

(정규 표현식을 사용할땐 ' '을 반드시 씌워줘야해요. 패턴을 쓸땐 ' '쓰실 필요없습니다)

해당 경로의 출력을 받아 정규표현식/패턴의 조건이 맞는 행만 출력합니다.


[옵션]

-b    검색된 행 앞에 각각의 블록번호 표시

-c    검색된 행의 총갯수 출력

-i    대/소문자 동일취급

-n    검색된 행의 행번호 표시

-v    검색되지 않은 행만 출력

-w    정규표현식/패턴을 하나의 단어로 취급, 단어가 존재하는 행만출력




/etc/passwd의 내용중 root라는 문자열이 포함된 행을 추출해보았습니다.



대문자알파벳 을 하나이상 가지고있는 행만 행번호를 붙여 추출해보았습니다.



pstree는 작동중인 프로세스를 트리형식으로 보여주는 명령어입니다. pstree를 파이프를 이용해 bash라는 단어를 포함안 부분만 추출해보았습니다.



oot라는 문자열이 포함된 행만 추출해보았습니다. 그후 -w옵션을 이용해 oot라는 단어가 포함된 행을 추출해보았지만 아무것도 뜨질않네요. root라는 문자열이 존재해 -w를쓰기전엔 문자열을 검색해 추출했지만 -w를 사용하므로써 oot라는 단어로 검색을했기에 아무것도 뜨지 않는거네요. 다른 옵션들도 시도해보시고 정확히 이해하시기 바랄께요!



2.awk

특정파일을 사용자가 지정한 정규표현식/패턴을 검색후 특정한 action을 행단위로 수행 하는 기능입니다. awk는 변수, 연산자, 함수 등도 쓰이기때문에 많은 연습을 하셔야 이해하시기 쉬울겁니다! awk를 소개 해드리기전에 레코드(행), 필드를 구분 하실줄 아셔야하는데요. 그림으로 설명 드리겠습니다.



빨간줄은 레코드(행)를 나타냅니다. 현재 위에는 3개의 레코드가 있네요. 필드는 하나의 레코드당 기본적으로 공백을 기준으로 하여 나누는데요. 첫번째 레코드엔 4개의 필드가 존재하네요. 2번째도 4개, 3번째는 6개가 존재하네요. 레코드와 필드 개념을 먼저 익히시고 awk설명을 보시기 바랍니다!


먼저 옵션, 변수, 연산자, 함수에 대해서 설명드리고 awk에 대해 자세히 설명드리겠습니다.

변수

패턴 또는 action에서 사용가능


NF    현재 검색되어지는 행의 필드갯수

NR    현재 검색되어지는 행의 번호

$0    현재 검색되어지는 행(레코드)

$n    현재 검색되어지는 행의 n번째 필드


연산자

패턴 또는 action에서 사용가능


산술: =, +=, -=, *=, /=, %=

조건: (condition)?(true일때):(false일때)

논리: ||, &&, !

비교: <, >, <=, >=, !=, ==


함수

action에서 사용가능


sqrt(x)            x제곱근

print 출력값     출력값을 출력

next               다음행을 입력 받음

system(cmd)   시스템내부 명령어 실행


[옵션]

-F [구분자]        필드를 나누는 기본 구분자는 공백이지만 옵션을 사용하여 구분자                                     를 지정 할수있습니다.


처음으로, 각행에 action만 수행하는 awk입니다.


awk [옵션] '{action(함수)}' [경로]

[경로]의 각행에 특정한 action수행



구분자를 :로 지정하고 /etc/passwd에서 각 레코드당 첫번째 필드를 출력하는 명령어를 써보았습니다. 



 제일 많이쓰이는 정규표현식/패턴 과 action을 함께 수행하는 awk입니다.


awk [옵션] '/정규표현식/ 또는 패턴{action(함수)}' [경로]

[경로]의 각행을 정규표현식/패턴 으로 검색후 특정한 action수행

awk [옵션] '$n ~  /정규표현식/ 또는 패턴 {action(함수)}' [경로]

[경로]의 특정 행/필드를 정규표현식/패턴으로 검색후 특정한 action수행

awk [옵션] '$n !~ /정규표현식/ 또는 패턴 {action(함수)}' [경로]

[경로]의 특정 행/필드를 정규표현식/패턴으로 검색되는 행또는 필드를 제외한 나머지에 특정한 action수행




패턴안에 비교연산자 >=를 넣어 4번째 필드 값이 500이상인 레코드에서 첫번째 필드만 출력하는 명령어를 써보았습니다.



no.+라는 정규표현식의 뜻은 no라는 문자열뒤에 하나이상 문자가 붙은 문자열을 뜻합니다. 그후 정규표현식의 조건이 충족하는 레코드에선 첫번째 필드를 출력하도록 했습니다.



7번째 필드중 /bin/bash를 가진 행에서 첫번째 필드만 출력하라는 명령어입니다.

/앞에 \를 붙이는 이유는 /가 특수기호이기때문에 순수 /로인식 시키기위해선 \를 꼭써줘야합니다.




7번째 필드에서 nologin문자열을 가지지 않은 행중 첫번째 필드만 출력하는 명령어입니다.



이번소개는 여기서 마치도록하겠습니다. awk부분은 아무 많이 쓰이지만 활용하기는 무척 헷갈리는 부분이 많습니다. 여러번 시도해보시고 감을 확실히 잡으셔야해요!

'OS > Linux' 카테고리의 다른 글

#10. Permission(권한)  (0) 2012.09.14
#09. User Account Management(사용자계정 관리)  (0) 2012.09.13
#07. 정규표현식(Regular Expression)  (0) 2012.09.11
#06. Standard I/O Redirection  (0) 2012.09.10
#05. shell, 변수  (0) 2012.09.10