AWK & SED 예제

System/Common 2012. 4. 5. 23:48

 

  • Awk?

- 자료 처리리포트 생성에 사용하는 프로그래밍 언어

- 사용자가 지정한 패턴 검색이나 특별한 작업을 수행하기 위해 파일을 행 단위로 조사

     

<Form>

# awk '패턴' [파일명]

# awk '{액션}' [파일명] -->액션으로 보통 print를 사용한다.

# awk '패턴 {액션}' [파일명]

     

     

예제1> passfile 의 내용은 아래와 같다. awk를 사용하여 첫 번째 필드를 출력하라.

# awk '{print $1}' passfile -> 동작으로 print를 할것이고 $1은 첫번째 필드를 의미.(필드는 공백으로 구분된다.)

     

     

     

예제 2> passfile에서 Access를 포함하는 행들의 첫 번째와 두 번째 필드를 출력하라.

# awk '/Access/{print $1, $2}' passfile --> / / 사이에 검색할 문자 or 패턴이 들어가며 액션으로 첫 번째 두 번째 필드

출력하도록 하였다.

     

     

예제 3> # df명령을 통해 출력되는 내용 중 두번째 필드가 9920624 이상인 행을 출력하라.

# df | awk '$2 >= 9920624' --> df의 프로세스를 awk로 넘겨주고, awk는 두번째 두번째 필드를

9920624와 비교하여 크거나 같은 행을 뽑는다. ( ' ' 안에는 패턴이 들어가게 된다.)

     

     

예제 4> # date 실행에 나오는 두 번째 필드와 여섯 번째 필드에 Month : 와 Year : 라는 문자를 추가해 뽑아내라.

# date | awk '{print "Month : "$2, "\nYear : "$6}' --> 액션으로 print를 쓰게되면 " "를 통해 문자로 출력이 가능하다.

때문에 "Mont : "다음에 두번째 필드가 출력된 것.

     

     

     

  • awk 명령에 사용되는 NR , NF 변수 와 옵션

   

* NR 변수 - 하나의 레코드를 처리한 후 1이 증가하는 변수. (즉, 해당 패턴이 몇 번째 행에 있는지 나타내 주는 변수)

* NF 변수 - 필드의 개수를 출력하는 변수

* -F 옵션 - 공백문자를 필드 구분자로 사용하지 않고 필드 구분자를 무엇으로 사용할지 지정하는 옵션.

* ~ ! - ~는 특정 레코드나 필드내에서 일치하는 정규 표현식 패턴이 존재하는지 검사.

ex) # awk '$1 ~ /[aA]pple/' [파일명] --> 해당 파일의 첫번째 필드apple or Apple이 일치하는 것을 뽑아냄.

! 는 not이다. 반대되는 개념. 즉, 패턴과 일치하지 않는 것을 뽑아낸다.

ex) # awk '$1 !~ /[aA]pple/' [파일명] --> 해당 파일의 첫번째 필드에 apple or Apple와 일치하지 않는 것을..

예제 1> NR 변수를 사용하여 해당 awk 에 의해 몇 개의 레코드가 검색되었는지 맨 앞과 맨 뒤에 나타내라.

# awk '{print NR, $1, $2}' passfile

# awk '{print $1, $2, NR}' passfile -> {print 뒤를 순서대로 출력할 것이다. 즉, NR은 { }안의 어느 위치 든 쓸 수 있다.

     

     

예제 2> NF 변수를 사용하여 검색된 해당 레코드에 몇 개의 필드가 있는지 나타내라.

# awk '{print NF, $1, $3}' passfile --> 첫 번째와 3번째 필드만 출력하되 NF는 해당 레코드에 몇 개의 필드가 있는지 표시.

   

     

예제 3> -F옵션을 사용하여 : 를 구분자로 사용 하여 첫번째 필드와 세 번째 필드를 출력하라.

# awk -F : '{print $1, $3}' passwd --> -F [구분자] 를 :로 지정해 줬기 때문에 :를 기준으로 필드를 인식한다.

결과를 보면 :를 기준으로 첫번째와 세번째 필드가 출력됨을 알 수 있다.

     

     

예제 4> Tab으로 필드를 구분하여 첫번째와 세번째 필드를 출력하라.

# awk -F '[\t]' '{print $1, $3}' passfile --> Tab은 [\t] 이렇게 인식시킨다. ' '(싱글쿼터)로 묶어준 이유는 대괄호를

인식하는 것을 방지하기 위함이다.

   

그 외 예제>

     

* ":"구분자를 기준으로 필드를 나누며 root를 포함하는 행을 출력

# awk -F : '/root/{print $0}' [파일명] -->> 패턴으로 root문자열을 검색하여 print $0 즉, 해당 패턴이 있는 모든 필드를 출력.

     

* n이나 s로 시작하는 행의 첫 번째 필드를 출력

# awk '/^[ns]/{print $1}' [파일명]

     

* 네 번째 필드가 jun 으로 끝나면 문자열 NAME : 과 두번째 필드 및 마침표를 함께 출력

# awk '$4 ~ /jun$/{print "NAME :" $2"."}' [파일명]

     

     

LAB)

- /etc/passwd 파일에서 bash 쉘을 사용하는 유저의 계정명과 홈 디렉토리를 다음과 같은 형식으로 출력하시오

     

EX) USER : [계정명] HOME : [홈디렉토리]

     

# awk -F : '/bash${print "USER : ["$1"]", "\t\tHOME : ["$6"]"}' /etc/passwd

     

     

     

  • Sed

- sed는 대화형 기능이 없는 편집기이다. 기본적으로 모든 행을 출력한다.

- 한 번에 한 행씩 처리하며, 결과를 화면으로 내보낸다. (리 다이렉션 > 을 통해 저장도 가능)

     

FORM

# sed '명령어' [파일명]

     

option

-n

해당 패턴 or 실행 결과만을 출력 (기본적으로 출력되는 모든 행을 막는다.)

-e

다중 편집을 가능하게 해준다.

     

sed 명령어 FORM(' '안에서 쓰인다.)

p

print 명령 사용자가 지정한 행을 출력
ex) '1,3p' -> 1행부터 3행까지 출력

d

delete명령 사용자가 지정한 행을 삭제

ex) '3d' -> 3번째 행을 삭제

r

read명령 사용자가 지정한 행을 읽어온다
ex) '3r phone' [패턴검색파일] --> 패턴검색할 파일의 3번째 행에 phone의 내용을 읽어와 출력.

w

write명령 사용자가 지정한 행에 쓴다.
ex) '/패턴/w [쓰여질파일]' [패턴검색파일] --> 패턴에 일치하는 행을 검색하여 [쓰여질 파일]에 쓴다.

a\

append명령 검색된 패턴 아래 행에 내용을 덧붙인다.
ex) '/패턴/a\내용' [파일명] --> 패턴에 일치하는 행의 다음에 내용을 삽입하여 출력.

i\

insert명령 검색된 패턴 위에 내용을 덧붙인다. a\와 사용법은 동일.

     

     

예제 >

sed를 사용한 phone파일의 1행에서 3행까지 출력

- # sed '1,3p' phone -->> 1행에서 3행까지 p(print) 하겠다는 의미인데,

sed는 기본적으로 모든 행을 출력하고 매칭되는 패턴을 또 출력하게 된다..

- #sed -n '1,3p' phone --> 그래서 해당 패턴의 결과만을 출력하게 해주는 -n옵션을 사용했다.

     

     

  • r(read)명령어 쓰기 FORM

# sed '/패턴/r [읽어올파일]' [패턴검색파일]

     

sed를 사용하여 aaa의 b패턴이 일치하는 행의 아래에 phone의 내용 출력

- # sed '/b/r phone' aaa --> aaa에서 b패턴을 검색하여 일치하는 행의 아래에 phone의 내용 출력

     

출처 : http://blog.naver.com/passioncode

'System > Common' 카테고리의 다른 글

HP LoadRunner  (0) 2012.04.24
로케일(Locale)이란  (0) 2012.04.19
PATH 환경변수 우선순위  (0) 2012.04.05
ssh와 sftp 사용 권한 설정  (0) 2012.04.04
/bin/false VS /sbin/nologin  (0) 2012.04.04
Posted by linuxism
,