[shell] awk 에 대한 상세 설명

### AWK 에 대한 상세 설명 ###

1. awk의 기본 개념

1) awk란?

; awk란 이름은 이 유틸리티를 작성한 A.V.Aho, P.J. Weinberger, B. Kernigham의

머리글자를 따온 것

① awk는 일종의 프로그래밍 언어지만 일반적인 언어라기 보다는 주로 패턴의 검색과

조작을 주목적으로 만들어진 것이다.

② 파일의 각 라인에서 필드(field)를 인식할 수 있는 패턴 매칭 기능을 가지고 이들

필드를 자유자재로 조작 가능한 유틸리티를 작성하고자 만든 것이다.

2) awk의 응용분야

데이터 프로세싱, 리포트 작성, 간단한 데이터베이스 구축, 등

3) awk를 이용한 작업

① 프로그래머가 자신이 작성한 프로그램의 입력 화일이 특정한 형식에 들어 맞게 이루어져

있는지 검사.

② 출력화일을 처리하여 리포트를 만들어 냄.

③ 다른 프로그램의 입력 형식에 맞게 변환하는 작업에 이용.

2. awk 프로그램의 구조 및 실행

(1) awk 프로그램의 구조

  1) awk ‘ pattern {action}

    pattern {action}

    .

    .

    .

    ‘ filenames <—————–입력화일(예제 : students)

  2) awk -f parttern-action-file filenames <—– 입력화일

    awk실행 action을 가진 프로그램 file

(2) awk의 pattern

  패 턴 내 용

      BEGIN 입력화일을 읽어들이기 전에 옆에 제시되는 문자을 실행시키도록 한다.

      END awk가 모든 입력을 처리한 후, 옆에 제시되는 문장을 실행시키도록 한다.

      expression 식을 평가한 후 이 식이 참, 즉 non-zero이거나 non-null인 경우

      문장을 실행한다.

      /re/ 정규식과 일치하는 문자열을 포함하고 있는 라인에서 문장을 실행한다.

      compound-pattern복합패턴이라는 것으로 &&(and), ||(or) , !(not) 그리고 괄호에

      의해 연결시킨 것이다.

      expression의 경우와 마찬가지로 복합 패턴도 참인 경우의 문장을 실행시킨다.

      pattern1, pattern2 이러한 패턴을 범위 패턴이라한다.

      현재 처리되고 있는 라인이 pattern1과 일치되고, 다음에 따라오 는 라인 중 임의의

      라인이 pattern2와 일치할 때, 범위 패턴은 두 라인 사이의 각 라인과 일치한다.

(3) awk의 연산자

      연 산 자 내용

      = += -= *= /= %= 배정(assignment)연산자

      + – * / % ++ — 산술 연산자

      || && ! 논리 연산자(|| = OR, && = AND, ! = NOT)

      > >= < <= == != 비교 연산자

      v ~p 변수 V가 패턴 P에 부합되면 참

      v !~p 변수 V가 패턴 P에 부합되지 않으면 참

(4) 액션(Actions)

     액션은 문장(statements)으로 이루어져 있다. 액션은 간단하게 상수 하나로 이루어질

     수도 있고, 개행 문자나 세미콜론(;)에 의해 분리된 몇 개의 문장의 연속으로 구성될

     수도 있다.

  ① expressions

  ② print expression-list

  ③ printf(format, expression-list)

  ④ if (expression) statement

  ⑤ if (expression) statement else statement

  ⑥ while (expression) statement

  ⑦ for (expression; expression; expression) statement

  ⑧ for (variable in array) statement

  ⑨ do statement while (expression)

  ⑩ break

  ⑪ continue

  ⑫ next

  ⑬ exit

  ⑭ exit expression

  ⑮ {statement}

(5) awk에서 미리 정의된 몇가지 변수들 변 수 내 용

      FILENAME 현재 처리되고 있는 입력 파일의 이름

      FS 입력 필드 분리문자

      NR 현재 레코드(행)의 번호

      NF 현재 레코드(행)의 필드의 갯수

      OFS출력되는 필드의 분리문자

3. awk의 기본예제

(1) 예제 입력 파일 소개

  ① 입력화일의 이름은 students

  ② 이 파일의 각 라인은 3개의 필드로 구성(학생 성명, 학과명, 나이)

  ③ 각 필드는 공백에 의해서 분리(공백을 필드 분리자로 간주함.)

  < awk는 각 라인에서 필드를 추출해 내는 데 필드 분리자(field separator)를 사용,

  필드 분리자는 보통 하나 이상의 공백 문자이다.>

1) 입력화일 예제 students

  % cat students

  John,P Physics 20

  Rick,L Mechanical 21

  Jack,T electrical 23

  Larry,M Chemical 22

  Phil,R Electrical 21

  Mike,T mechanical 22

  Paul,R Chemical 23

  John,T Chemical 23

  Tony,N Chemical 22

  James,R Electrical 21  

예 1) 식(expression)에 맞는 field 프린트하기

  % awk ‘$3 > 22 {print $1}’ students

  Jack,T

  Paul,R  

  John,T  

예 2) if 문을 사용하여 조건에 맞는 line 분리하기(각 파일에 저장)

  

  step 1 : if문을 사용하는 프로그램을 awkprog1이라는 파일로 만든다.

  

    % cat awkprog1

    { if ($1 ~ /^J/) printf “%s\\n”, $0 > “Jfile”

    if ($1 ~ /^P/) printf “%s\\n”, $0 > “Pfile”}

  

  step 2 : students 입력화일에 awkpog1 프로그램 화일을 적용한다.

  

    % awk -f awkprog1 students

  

  step 3 : 결과 보기

    % cat Jfile

    John,P Physics 20

    Jack,T electrical 23

    John,T Chemical 23

    James,R Electrical 21

    % cat Pfile

    Phil,R Electrical 21

    Paul,R Chemical 23

예 3) 평균값 구하기

  <프로그램 awkprog2, awkprog3>

  % cat awkprog2

  {sum += $3}  

  END {printf “The average of the ages is %.2f\\n”, sum/NR}

  

  % cat awkprog3

  {sum += $3

  ++no}

  END {printf “The average of the ages is %.2f\\n”, sum/no}

  

  <결 과>

  % awk -f awkprog3 students

  The average of the ages is 21.80

예 4) while 과 do문을 이용하여 평균값 구하기

  <프로그램 awkprog4>

  % cat awkprog4

  {if (NF > 0) {

  sum = 0

  n = 1

  while (n <= NF) {

  sum = sum + $n

  n = n+1

  }

  printf “Average is %d\\n”, sum/NF

  }

  else

  print}

  <예 제>

  % awk -f awkprog4 test

  Average is 17

  Average is 3

  Average is 25

  Average is 0

Sed

1. sed란?

(1) 개념

  sed는 Stream Editor의 약자로서 파일의 수정을 주 목적으로 한다.

  이는 파일을 순방향으로 읽는 동안 연산을 수행하며 텍스트 화일에서의 반복 수정에 용이하다.

(2) 기능

  주어진 텍스트 패턴을 갖는 모든 행을 delete

  특정 행에서 어떤 텍스트 패턴을 다른 패턴으로 바꿈

  하나의 파일을 다른 곳의 파일로 복사

  입력화일의 특정부분을 출력화일로 보냄

2.sed의 수행방법

  sed는 순환적으로 동작하며, 아래와 같은 순서로 실행된다.

  (1) 실행순서

    ① 입력행을 읽어 패턴 공백으로 옮긴다.

    <패턴 공백? ed와 같이 sed도 편집할 텍스트를 편집버퍼에 저정하는데, 이 버퍼를 패턴 공백이라>

고 한다.

      ed : 파일전체를 버퍼에 저장

      sed : 한 행의 텍스트만 패턴 버퍼에 저장>

    ② 편집대본(수정할 내용들)을 실행

    ③ 패턴 공백을 출력값으로 복사

  (2) sed 구조

  

  

  

      1) sed의 명령행 옵션

            옵 션

            내 용

            -n sed -n -n 옵션이 주어지면 print 명령 주의 하나를 만나야만 출력이 생성된다.

            -e sed -e [command]-e 다음의 command는 편집 대본이다. 여기서는 여러 개의 편집 대본>

을 하나의

            명랭행에 지정가능하다.

            -f sed -f [file] -f 다음에 오는 파일은 편집대본을 포함한 파일이다.

  

  

      2) sed 명령

            옵 션 내 용

            s 하나의 문자열을 다른 문자열로 대치한다.

            a 다음 입력 행을 읽기 전에 파일에 새로운 행을 추가한다.

            i 지정한 행에 문자열을 삽입한다.

            d 지정한 라인을 삭제한다.

            c 주소가 지정된 각 행을 user가 기술한 행으로 바꾼다.

            (변경(c)명령은 행 전체를 변경하는 것이고, 대치(s)명령은 행의 일부분에 변경, 적용될

수 있다.)

            p 출력

            w 선택된 라인을 write

3. sed의 기본예제

  

  <기본 예제>

    % cat remind

    Janet today at 4.  

    Call DEC  

    add serial line for Brad

    Home at five sharp  

  예제 1) 대치(s)명령, 삽입(i)명령, 삭제(d)명령 사용 예제

    <편집대본(파일명) : script>

    % cat script

    s/DEC/Dept. Environ. Cons./

    s/today/tomorrow/

    1i\\

    Werner and Raquel this weekend\\

    Feed polly for adam

    4d

    <결과>

    % sed -f script remind

    Werner and Raquel this weekend

    Feed polly for adam

    Janet tomorrow at 4.

    Call Dept. Environ. Cons.

    add serial line for Brad

  예제 2) 변경(c) 명령 사용 예제

    % cat script1

    2c\\

    Dept. Environ. Cons

    <결과>

    % sed -f script1 remind

    Janet today at 4.

    Dept. Environ. Cons

    add serial line for Brad

    Home at five sharp

  예제 3) write명령을 사용한 예제

  % cat script2

  1,2w firstfile

  s/DEC/Dept. Environ. Cons./w rewrite

  4d

  w delfile

  <결 과>

  % sed -f script2 remind

  Janet today at 4.

  Call Dept. Environ. Cons.

  add serial line for Brad

  % cat rewrite

  Call Dept. Environ. Cons.

  % cat firstfile

  Janet today at 4.

  Call DEC

  % cat delfile

  Janet today at 4.

  Call Dept. Environ. Cons.

  add serial line for Brad

  예제 4) g옵션의 사용

  <기본예제>

  % cat file1

  It follows, then, that the divine, being good,

  is not, as most people say

  for the food things in human lige are far fewer than

  the evil, and, whereas the good must be ascribed to heaven only,

    

    

  <s옵션을 이용하여 문자열 바꾸기>

  % sed -e s/the// -e /for/d file1

  It follows, n, that the divine, being good,

  is not, as most people say

  evil, and, whereas the good must be ascribed to heaven only,

    

  <g옵션을 이용하여 문자열 바꾸기>

  % sed -e s/the//g -e/for/d file1

  It follows, n, that divine, being good,

  is not, as most people say

  evil, and, whereas good must be ascribed to heaven only,

서진우

슈퍼컴퓨팅 전문 기업 클루닉스/ 상무(기술이사)/ 정보시스템감리사/ 시스존 블로그 운영자

You may also like...

1 Response

  1. meditation music 말해보세요:

    meditation music

페이스북/트위트/구글 계정으로 댓글 가능합니다.