LINUX
2006.02.16 10:02

awk 명령어 사용법

조회 수 114545 댓글 1
?

단축키

Prev이전 문서

Next다음 문서

+ - Up Down Comment Print
?

단축키

Prev이전 문서

Next다음 문서

+ - Up Down Comment Print
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

       

---------------------------------------------------------------------------
 
[awk 기본 문법]
awk   [-f prog-file]   [-F c]   [ 'pattern {action}' ]   [filename] 
 
 
  -f prog-file
 
 awk의 실행 Action을 가진 프로그램 파일 지정
 
 -F c
 
 필드 구별자(FS: Field Separator) 지정
 
 'pattern {action}'
 
  awk program의 command 문장은 single quotes(' ') 또는 double quotes(" ")로 
 둘러싸여 있습니다. 
 
 Input의 각 라인(Line)이 원하는 pattern과 일치하면, action 부분이 실행됩니다.
 
 action 없이 pattern만 있는 경우, 원하는 pattern을 찾으면 각 Input 라인을 그대로 
 출력합니다.
 
 pattern 없이 action만 있는 경우, Input의 각 라인에 대해 action을 실행합니다.
 
 action 부분은 항상 중괄호({})로 둘러싸여 있습니다.
 
 여러 action을 실행 시, action 사이를 세미콜론(;)이나 new-line 문자로 구분할 수 
 있습니다.
 
 패턴유형 설 명
BEGIN 입력파일을 읽어 들이기 전에, BEGIN 옆에 제시되는 { } 안의
Action을 실행시킵니다.
END 모든 입력을 처리한 후, END 옆에 제시되는 { } 안의 Action을
실행시킵니다.
expression 식을 평가한 후, 이 식이 참이면 즉 non-zero 이거나 non-null 인 경우,
뒤의 Action을 실행시킵니다.
/re/ 정규식과 일치하는 문자열을 포함하고 있는 라인에서 Action을
실행시킵니다. 
compound-
pattern 복합 패턴이라는 것으로 여러 개의 expression을 괄호와 &&(and),
||(or) , !(not) 로 연결시켜 그 결과가 참인 경우 Action을
실행시킵니다. 
pattern1,
pattern2 이러한 패턴을 범위 패턴이라고 합니다. 현재 처리되고 있는 라인이
pattern1과 일치되고, 다음에 따라오는 라인 중 임의의 라인이
pattern2와 일치할 때, 범위 패턴은 두 라인 사이의 각 라인과
일치합니다. 
 
 
 
 filename
 
 awk 프로그램에 입력될 입력 파일 지정
 

 awk에는 awk가 내부적으로 가지는 변수들이 있습니다. 이 변수들을 사용하여, 필드 및
레코드의 구분을 좀 더 다양하게 할 수 있으며, 좀 더 유연한(flexible)프로그램을 짤 수가
있습니다.
 
 아래 표는 각 내부 변수들에 대해서 설명하고 있습니다. 
 
 내부 변수 설 명
FILENAME 현재 처리하고 있는 file의 이름 
FS Field Separator- 필드 구분자 
RS Record Separator - 레코드 구분자 
NF Number of Fields - 현재 레코드의 필드 수
NR Number of Records - 현재 레코드의 번호 
$1 입력되는 Record의 첫 번째 필드
$n 입력되는 Record의 n 번째 필드 
OFS Output Fields Separator - 출력시의 FS.
이 값을 변경하게 되면, 출력시의 FS가 바뀌게 됩니다.
ORS Output Records Separator - 출력시의 RS.
이 값을 변경하게 되면, 출력시의 RS가 바뀌게 됩니다. 
 
 
  내부 변수 사용 예
 
  
test.txt 파일을 확인한 결과가 다음는 같았습니다. 
 
$ cat test.txt
 
AA aaa bbb ccc ddd
BB bbb ccc ddd eee
CC ccc ddd eee fff
DD ddd eee fff ggg
 
 
 
이 파일의 필드수를 구하는 명령은 다음과 같습니다.
 
$ awk '{print NF}' test.txt
5
5
5
5
 
4개의 각 레코드가 가지는 필드 수가 5개씩이므로 화면에는 5가 4번 찍힙니다.
 
 
hello.txt 파일의 내용은 다음과 같습니다.
 
$ cat Hello.txt
Hello, World!!
Be The Reds!!
 
 
여기서 awk 명령을 이용하여 Hello 필드를 포함하고 있는 모든 레코드를 출력하기
위한 명령은 다음과 같습니다. 
 
$ awk '/Hello/' Hello.txt
Hello, World!!
 
 
action 부분이 없을 때는 Hello 필드를 포함하고 있는 모든 레코드가 출력됩니다.

awk의 Output을 다른 파일로 보내기
 
 awk의 출력 action을 다른 파일로 보내기 위해서는 '>'나 '>>'를 사용하면 됩니다.
 
  
현재 디렉토리와 해당 파일의 내용을 확인한 결과는 다음과 같습니다. 
 
$ ls
Hello.txt

$ cat Hello.txt
Hello, World!!
Be The Reds!!
 
 
 
첫 번째 필드는 file1.txt 파일로, 두 번째 필드는 모니터로 출력하려면 다음과 같이
명령을 실행합니다.
 
$ awk '/Hello/ {print $1 > "file1.txt"; print $2}' Hello.txt
World!!
 
 
file1.txt 파일이 없으므로 신규 생성하여 데이터를 입력합니다.
이를 확인한 결과는 다음과 같습니다. 
 
$ ls
Hello.txt file1.txt

$ cat file1.txt
Hello,
 
 
 
 
일반적인 특수 문자
 
 awk의 검색 패턴을 만들 경우 slash(/)로 감싸서 표현하는데, slash 사이에는 다음과 같은
특수 문자를 사용할 수 있습니다.
 
 특수 문자 설명
| Bar(|)의 왼쪽과 오른쪽의 논리적 OR 연산
+ 선행하는 패턴의 하나 또는 그 이상의 반복
? 선행하는 패턴이 없거나 또는 한번만 나타남을 의미
* 선행하는 패턴의 임의의 횟수의 반복
[] 대괄호([]) 사이의 임의의 문자 하나
[a-z] 두 문자 사이의 임의의 문자 하나
^ 라인의 처음을 의미
$ 라인의 마지막을 의미
. Period 위치의 문자 하나
다음 문자의 특수한 의미를 없앰
() 패턴을 그룹화 함
 
 
  
$ cat Hello.txt
Hello, World!!
Be The Reds!!
 
 
다음의 명령은 위의 파일에서 Be로 시작되는 레코드를 검색하여 출력합니다. 
 
$ awk '/^Be/' Hello.txt
Be The Reds!!
 
 
 
 관계 연산자
 
 awk의 패턴 표시에도 관계 연산자인 <, <=, ==, !=, >=, >를 사용할 수 있습니다.
 
 관계 연산자 설명
A < B A가 B보다 작다.
A <= B A가 B보다 작거나 같다.
A == B A와 B가 같다.
A != B A와 B가 같지 않다.
A >= B A가 B보다 크거나 같다.
A > B A가 B보다 크다.
 
 
  
$ cat num.txt
1 10 100 1000 10000
10000 1000 100 10 1
 
 
다음의 사용예는 첫째 필드의 값이 둘째 필드의 값보다 큰 레코드를 출력하는
것입니다. 
 
$ awk '$1 > $2' num.txt
 
 
 
awk의 제어문은 C의 제어문과 비슷하며 다음과 같이 사용할 수 있습니다.
 
  if 문
 
 
  if 문의 기본 문법
 
 if(condition) Action
else Action
 
 
 if 문의 사용 예 
 
  
$ awk '{if($1 != "Hello,") print $0; else print "Wow!!"}' Hello.txt
Wow!!
Be The Reds!!
 
  
첫째 필드가 "Hello,"이면 Wow!!를 출력하고, 아니면 해당 레코드를 출력합니다.
 !!$0 은 해당 레코드 전체!!

 
 
 
 
  while 문
 
 
  while 문의 기본 문법
 
 while(condition) Action
 
 
 while 문의 사용 예 
 
  
$ awk '{i=1; while(i<=2) {print $(i); i++}}' Hello.txt
 
Hello,
World!!
Be
The
 
 
변수 i는 1의 정수값(i=1)으로 시작하고 계속 1씩 증가(i++) 합니다. i 값이 2보다 작거나 같을 동안
Action을 실행하는데, 출력될 필드도 변수 i 값에 맞추어 다르게 선정됩니다.

for 문
 
 
  for 문의 기본 문법
 
 for (initialize; final; increment) { Action }
 
 
 for 문의 사용 예
 
  
$ awk '{for(i=1;i<NF;i++) {print $(i)}}' Hello.txt
 
Hello,
Be
The
 
 
변수 i는 1의 정수값(i=1)으로 시작하여 계속 1씩 증가(i++) 합니다.
i 값이 레코드의 필드 수(NF)보다 작을 동안만 Action을 실행하는데, 출력될 필드도 변수 i 값에
맞추어 다르게 선정됩니다.
 
 
 
awk에는 print, printf 외에 다음과 같은 내장함수가 있습니다.
 
 내장함수 설명
length(x) 문자 x의 길이 반환
awk '{print length($1); print $1}' hello.txt
6
Hello,
2
Be
sqrt(x) x의 평방제곱근 값 반환
log(x) x의 Log 값 반환
exp(x) x의 Exponential 값 반환
int(x) x의 정수 값 반환
cos(x) x의 Cosine 값 반환
atan(x) x의 Arctangent 값 반환
rand(x) 0에서 1사이의 임의의 값 반환
sin(x)/td>  x의 Sine 값 반환
sran(x) rand(x)의 새로운 Seed 값 반환
match(s, r) r번 발생하는 s의 위치를 돌려주거나 0을 반환
substr(s, m, n) s 문자열에서 m 위치에서 시작하여 n개의 문자를 반환
sub(r, t, s) s 문자열에 있는 첫 번째 r과 t를 치환
gsub(r, t, s) sub()와 같으나 해당하는 모든 경우를 치환
split(s, array, sep) 문자열 s를 array[1]..array[n]으로 나눕니다.
sep이 지정되지 않으면 FS 값을 기본으로 합니다.
index(s1, s2) s1에서 s2 문자가 검색된 위치를 알려줍니다.
toupper(s) 문자 s를 대문자로 치환
tolower(s) 문자 s를 소문자로 치환
system(command) 유닉스 명령어 command를 실행하고 exit 상태를 반환
 
  • Dreamy 2006.02.16 10:02
    SUBJECT: Awk 명령어 사용법


    o awk 명령어
    awk라는 이름은 이를 개발한 세 사람의 이름 Aho, Weinberger, Kernighan에서 유래된 것이다.
    awk명령어는 일련의 입력 화일을 읽어 지정된 패턴과 일치하는 패턴을 간직한 라인을 찾는다.
    패턴이 일치하면 지정된 연산이 실행된다. 여기서의 연산은 라인 내의 필드 조작이나 필드값을
    이용한 산술 연산을 의미한다. 이 awk는 shell programming과 bc 그리고 C 프로그래밍언어의 기능을 갖춘
    프로그래밍 언어로 bc와 같이 완벽하게 해독이 되며 쉘의 인수인 $1, $2, $3과 같은 이름을 가진
    필드 변수가 각 입력 라인에 사용될 수 있다. 또 C 언어와 유사한 프린팅, 제어 연산자도 가지고 있다.
    awk의 사용에는 두가지 방법이 있다. 한가지 방법은 다음 형식으로 타이프하는 것이다.
    # awk program filename --> program: 명령어들로 이루어짐
    filename: awk가 작용할 화일의 명칭
    # awk -f file filename --> file: 프로그램 명령어들을 포함하고 있는 화일의 명칭
    프로그램은 하나 또는 그 이상의 프로그램 라인들로 이루어진다. 프로그램 라인은 일반적으로
    패턴과 작용으로 이루어진다.
    /rotate/ {print} --> 패턴은 rotate(단순한 문자열 패턴은 /들로 둘러싸임)
    작용은 print이다.
    이것을 사용하면 , awk 프로그램은 문자열 rotate를 포함하고 있는 라인들을 발견하고 그것들을 프린트한다.
    그것은 grep rotate filename을 사용하는 것과 같다.
    필드들은 공백들에 의해 분리된 문자열들이다.
    awk 프로그램은 필드에 대한 레이블 시스템을 가지고 있다. $1은 첫 번째 필드이고 $2은 두 번째 필드이다.
    $0은 특수한 의미를 갖는바, 그것은 전체 라인을 나타낸다.
    ---------------------------------------------------------------------------------------------
    패 턴 의 미
    ---------------------------------------------------------------------------------------------
    /fish/ 문자열 fish를 포함하고 있는 라인
    $1 - /fish/ 첫번째 필드가 문자열 fish를 포함하고 있는 라인
    $3 - /fish/ 세번째 " "
    $1! - /fish/ 첫번째 필드가 문자열 fish를 포함하고 있지 않은 라인
    ---------------------------------------------------------------------------------------------

    ---------------------------------------------------------------------------------------------
    작 용 의 미
    ---------------------------------------------------------------------------------------------
    {print $2} 두번째 필드만을 프린트하라
    {print $4,$2} 네번째 필드의 내용을 프린트한 다음 두번째 필드의 내용을 프린트하라
    {print $2,$2+$4} 두번째 필드를 프린트한 다음 두번째 필드와 네번째 필드의 합을 프린트하라
    {s=$2+$4; print s} 두번째와 네번째 필드를 추가한 다음, 그 합을 프린트하라
    ---------------------------------------------------------------------------------------------
    패턴에서의 ~와 !사용에 주목하라. ~는 우측에 있는 패턴이 좌측에 있는 필드에 포함된다는 것을 의미한다.
    !~ 조합은 우측의 패턴이 좌측의 필드에 포함되지 않음을 의미한다.
    { }작용들을 세미콜론으로 분리시킴으로써 하나 이상의 작용들을 포함시킴 수 있다.

    몇가지 이러한 개념들을 사용하는 간단한 예를 고찰해보자. 화일 sales는 여섯 열의 정보를 가지고 있다.
    첫번째 열은 품목 명칭, 두번째 열은 품목의 판매가격 , 그리고 다음의 네 열들은 품목에 대한 분기별
    판매수이다.
    # vi sales
    carts 29.99 45 13 55 22
    corks 0.02 30 20 25 93
    doors 49.99 40 15 20 25
    geese 15.00 2 8 1 128
    nighties 50.00 11 23 15 82
    우리는 두 열을 추가하려 한다. 품목합계 그리고 현금 판매 합계.
    다음과 같은 addup이라는 화일을 작성한다.
    # vi addup
    {total=$3+$4+$5+$6;print $0, total, total*$2}
    이 작용은 ;에 의해 분리된 두 부분들을 가지고 있다. 첫 부분은 판매수를 합하고 영리하게도 합계를
    total이라 부른다. 두번째 부분은 원래의 라인($0)을 프린트하고, 그 뒤에 합계를 , 그 다음에는
    total*$2를 프린트하는데, 이것은 합계x두번째 열을 의미한다.
    # awk -f addup sales
    carts 29.99 45 13 55 22 135 4040.64
    corks 0.02 30 20 25 93 93 3.36
    doors 49.99 40 15 20 25 100 4999
    geese 15.00 2 8 1 128 139 2085
    nighties 50.00 11 23 15 82 131 6550


    o awk 입력 라인을 읽는 방법
    표준 입력이나 화일로부터 읽혀지는 각 라인은 공백문자로 구분된 필드를 가지고 있는 것으로 간주된다.
    -F(field)선택자 뒤에 임의의 문자를 입력하면 필드 구분자가 그 문자로 변경된다.
    예를 들어 :(콜론)을 구분자로 사용하려면 다음과 같이 입력한다.
    # awk -F: -f prog files

    o awk의 패턴과 연산
    awk가 읽어들이는 라인과 필드들에 대한 작업은 패턴-연산의 쌍으로 정의되며 이쌍은 다음과 같은
    형식을 갖는다.
    pattern {action}
    연산 부분을 중괄호로 둘러쌈으로써 패턴과 구분한다. 연산 부분이 생략되면 그 라인이 프린트된다.
    일반적으로 사용되는 연산에는 print가 있으며 이 연산은 인수를 표준 출력에 출력한다.
    다음연산은 입력 필드 개의 순서를 바꾸어 출력한다.
    { print $2, $1}
    # vi in.file
    hello goodbye again
    111 222
    thirty forty
    # vi awk.prog1
    {print $2, $1}
    # awk -f awk.prog1 in.file
    goodbye hello
    222 111
    forty thirty
    위의 예에서 print의 인수는 콤마로 구분되었으며 이로 인해 출력 데이터 사이에 현재의 필드 구분자가
    삽입되었다. 콤마가 생략되면 $1과 $2가 연속하여 출력된다.
    예를 들어 다음의 awk 프로그램은
    # vi awk.prog2
    /hello/ {print $2, $1}
    # awk -f awk.prog2 in.file --> 입력 화일 내에서 패턴 /hello/과 일치하는 라인은 1개뿐이기
    goodbye hello 때문에 그 라인에 대해서만 지정된 연산인 print가 실행되었다.
    # vi awk.prog3
    /hello/ {print $2, $1}
    /thirty/ {print $1, $2, "and more"}
    # awk -f awk.prog3 in.file --> print명령어의 인수가 따옴표로 둘러싸여 제공되었으며 그 문자열이
    goodbye hello 출력에 표시되었다.
    thirty forty and more
    # vi awk.prog4
    /hello/||/111/ {print "htt", $1, $2}
    # awk -f awk.prog4 in.file --> ||연산자는 2개의 정규식 중 하나만 일치하면 지정된 연산을 실행하며
    hit hello goodbye &&연산자는 2개의 정규식이 모두 일치애햐 지정 연산을 실행한다.
    hit 111 222 !연산자는 정규식이 일치하지 않아야 지정된 연산을 실행하며
    정규식 앞에 기술된다.
    # vi awk.prog5
    /^[Hh1]/ {print "htt", $0}
    # awk -f awk.prog5 in.file --> $0을 사용했기 때문에 입력 라인 전체가 출력되었음
    hit hello goodbye again Hh1으로 시작하는 line을 출력
    hit 111 222
    # vi awk.prog6
    /hello/ {
    print $2
    print "another"
    print $1
    }
    # awk -f awk.prog6 in.file --> 패턴 /hello/와 일치하는 첫번째 입력 라인만이 연산의 대상이 됨
    goodbye
    another
    hello

    o awk를 이용한 숫자 연산
    awk의 산술 연산이 bc의 산술 연산과 다른 점은 awk는 입력 화일 내의 라인 중 일부를 선택하는
    패턴 부분을 사용할 수 있다는 것이다.
    예를 들어 awk의 내장 함수인 length는 문자열로 취급되는 입력 필드의 길이를 뱐환하며 숫자 변수는
    숫자로 취급되는 필드의 값을 할당받을 수 있다.
    # vi awk.prog7
    {
    s += $2
    print $2, "length=" length($2), "s=" s
    }
    # awk -f awk.prog7 in.file --> 숫자로 변환될수 없는 문자열은 값이 0이 된다.
    goodbye length=7 s=0 문자열 thirty가 그 예로서, 숫자로 변환될수 없다. 그러나 문자열
    222 length=3 s=222 222는 숫자로 올바르게 변환되었다. 또한 s=0과 같은 형식으로 변수에
    forth length=5 s=222 값을 할당할 수 있다.
    다음은 awk변수의 욜바른 예이다.
    s
    S
    SS
    S1
    qwerty[42]
    변수를 사용하기 전에 선언하거나 초기화시킬 필요는 없다. awk가 자체적으로 변수를 초기화시키며
    필요에 따라 그 변수를 문자열이나 숫자를 기억시킬수 있다.
    # vi awk.prog8
    /hello/ {
    SSS=34
    print "SSS is", SSS
    SSS=hello
    print "SSS is", SSS
    }
    # awk -f awk.prog8 in.file --> 이와 같은 자동적인 변수 형식 변환은 변수의 사용을 수월하게 한다.
    SSS is 34
    SSS is hello

    o 처리를 시작하고 끝내기 위한 특수 패턴
    정규식 패턴 외에도 2개의 특수 패턴으로 BEGIN과 END가 사용된다. BEGIN은 첫 번째 입력 라인을
    읽기 전에 awk프로그램의 선두에서 실행되며 END는 마지막 입력 라인이 처리된 후 프로그램의 제일
    끝에서 실행된다.
    BEGIN은 주로 변수 초기화 등의 작업에 사용되며 END는 마지막 계산을 하고 출력을 요약하는 작업에
    사용된다. BEGIN이나 END가 없어도 되나 필요한 경우 포함시킬 수 있다.
    예를 들어 다음 프로그램은 여러 개 숫자의 평균값을 출력한다.
    BEGIN {
    print "Beginning to process the input data ..."
    }
    {
    s += $1
    n++
    }
    END {
    print "mean of these",n,"data items is", s/n
    }
    메시지를 프린트하는 BEGIN과 관련된 연산은 프로그램의 선두에서 실행되며 그 후에 각 입력라인이
    읽혀진다. 패턴이 생략되었기 때문에 모든 입력 라인에 대해 연산이 실행되었다.
    첫 번째 필드를 변수 s에 더하고 1을 증가시키며 마지막의 END패턴은 모든 입력이 처리된 후 실행된다.
    이 END 패턴에서는 계산의 최종 결과를 출력하고 있다.

    ----------------------------------------------------------------------------------------

    간단한 awk 사용법



    다음은 서버를 관리할 때 유용한 awk 명령어입니다.

    참고하시면 될 것 같습니다.



    1. httpd.conf 파일에서 ServerName이란 문자열을 찾아 두번째 필드값만 출력.

    cat httpd.conf | grep ServerName | awk '{print $2}'





    2. httpd.conf 파일에서 ServerName이란 문자열을 찾아 두번째 필드값만 출력하고

    그 출력된 값에서 .으로 구분된 두번째 값을 출력.

    cat httpd.conf | grep ServerName | awk '{print $2}' | awk -F. '{print $2}'





    3. passwd 파일에서 사용자와 홈디렉터리를 출력.(예: user :root home_dir :/root)

    cat /etc/passwd | awk -F: '{print "users :"$1" ""home_dir :"$6}'



    4. httpd 프로세스를 조회. 두번째 필드값인 PID값만 출력해서 xargs 명령어로 받아 kill 시킴.

    ps -ef | grep httpd | grep -v grep | awk '{print $2}' | xargs kill -9



    5. killall process_name (이런 방법도 있죠.. 그런데 이 방법은 프로세스명으로 죽입니다.

    예를 들어 pma란 사용자의 프로세스를 모두 죽이는 방법은 4번과 같이 해야 되겠죠?)

    -------------------------------------------------------------------------------------

    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

Dreamy의 코드 스크랩

내가 모으고 내가 보는

List of Articles
번호 분류 제목 날짜 조회 수 추천 수
» LINUX awk 명령어 사용법 1 2006.02.16 114545 15
505 MFC CString 에서 형변환 함수들 총정리 2010.11.29 102655 0
504 Android adb am 명령어 ; app 실행 및 Intent 전송 2013.08.12 100141 0
503 Android [GIT 사용법] Git Tutorial 2011.12.26 96416 0
502 일반 ┗ bat(배치)파일 문법 2007.08.06 93360 8
501 LINUX [Shell Script] 리눅스 쉘(Shell) 스크립트 2014.09.23 86673 0
500 JAVA JAVA String 클래스 메소드 정리 1 2015.02.05 84884 0
499 LINUX [Shell Script] 쉘 스크립트에서의 사칙연산과 문자열 자르기 2014.11.01 81702 0
498 C# StringBuilder로 문자열 처리를 빠르게 2012.12.04 77888 0
497 LINUX du 명령어 사용법(디스크 용량 확인) 1 2012.05.31 77386 0
496 Python BeautifulSoup으로 웹에 있는 데이터 긁어오기 2013.04.08 76864 0
495 Android [GIT 사용법] 초보자가 알아두면 좋을 명령어 정리 1 2011.12.26 66409 0
494 LINUX errno.h - system error numbers 2013.01.09 65719 0
493 MFC API를 이용하는 유니코드와 ANSI 문자열간의 변환 방법 2006.04.14 63031 0
492 일반 findstr 사용법 - window용 find, grep 명령 2014.02.04 63000 0
목록
Board Pagination ‹ Prev 1 2 3 4 5 6 7 8 9 10 ... 34 Next ›
/ 34

나눔글꼴 설치 안내


이 PC에는 나눔글꼴이 설치되어 있지 않습니다.

이 사이트를 나눔글꼴로 보기 위해서는
나눔글꼴을 설치해야 합니다.

설치 취소

Designed by sketchbooks.co.kr / sketchbook5 board skin

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5