원본 문서에서 패턴을 검사해 원하는 값을 얻는다.
표준 입력으로 값을 받아 awk 스크립트를 통해 원하는 표준 출력을 얻어낸다.
awk는 1977년에 AT&T 연구소의 Alfred V.Aho, Peter J. Weinverger, Brain W. Kernighan 세 사람이 만들었다. awk라는 이름도 이 세 사람의 앞 글자로 만들어졌다. 리눅스에서는 1986년 Paul Rubin과 Jay Fenlason에 의해 GNU 버전의 awk가 만들어 졌다.
awk는 일정한 규칙을 가지고 있는 데이터를 처리하여 계산, 통계, 비교분석 혹은 필터링을 통한 데이터 추출 등에 다양하게 사용될 수 있다. sed와 비슷한 기능을 한다고 할 수 있으며 awk와 sed의 장점을 묶어서 만들어진 perl로 발전되었지만 단순한 구조의 데이터의 경우 더 효과적으로 쓰일 수 있어서 지금도 많이 사용되고 있다.
awk는 쉽고 유용하게 쓰일 수 있다. 단순히 명령어로 사용되거나 다른 스크립트에 sed와 함께 다른 스크립트에 이용될 수 있고 awk 만의 스크립트 파일의 작성도 가능하다.
명령어 사용
현재 디렉토리의 파일 정보를 보기 위해 ls -al 명령어를 이용하여 파일 목록을 출력한다. 이 목록 중 파일의 권한과 파일명만 보기를 원한다면 awk를 이용해 어렵지 않게 편집 할 수 있다. ls -al 명령으로 출력되는 데이터를 파이프 ( | )로 awk가 받아 파일의 공백을 기준으로 나누어 첫 번째 필드와 9 번째 필드를 출력한다.
awk로 필터링하여 파일의 권한과 파일명만 출력한다. 위와 같이 awk는 라인을 받아와 구분자를 통해 구분하고 print 명령으로 출력하게 된다.
ls -al로 출력되는 행을 공백으로 구분하면 아래와 같이 구분된 $1~$9 까지 필드이다 각 필드는 공백을 기준으로 아래와 같은 번호로 구분된다. $0은 모든 필드를 말한다.
파일권환$1 하드링크번호$2 사용자$3 그룹$4 용량$5 월$6 일$7 시간$8 파일명$9
파일 목록 중 1 Mb 이상의 용량을 갖는 파일명과 용량을 출력하고 싶다면 awk의 조건문을 사용하여 가능하다. 1Mb = 1048576bit 이기 때문에 용량을 나타내는 5번째 필드 중 1048576 보다 큰 라인을 출력하며 그 중 5 번째와 9번째 필드만 출력한다.
awk를 이요하면 문서의 특정 문자나 문자열을 검색하여 검색되어 나온 라인만 출력 할 수 있다.
root계정을 포함한 라이만 검색하여 출력하였다.
첫 번째 예제에서는 문자열 중 구분 되어 있는 필드를 지정하여 원하는 필드만 출력 하였고 두 번째 예제에서는 보기를 원하는 패턴을 가진 라인만 검색하여 출력하였다 이 두가지를 조합하면 보기를 원하는 라인에 특정 필드만 출력이 가능하다.
두 번째 예제는 /etc/group 파일을 root라는 패턴으로 검색하여 root라는 문자열을 포함한 라인만 출력되었다. ":표시로 구분지은 필드 중 제일 먼저 나오는 것이"그룹 명인데 다음 예제는 이 그룹명만 출력 되도록 만들었다.
-F는 구분자를 정의한 옵션으로 기본을 공백을 사용하지만 이 파일과 같이 "-F:"로 구분자를 지정해 사용할 수 있다.
/root/로 검색한 패턴부분에, 정규 표현식을 사용하면 더욱 자세한 패턴을 검색할 수 있다.
스크립트 파일 이용
시작(Begin) -시작 단계로서 전체 스크립트를 위한 정의 단계이다. (Preprocessor)
실행(Routin) -실행단계로서 이 스크립트의 기능을 수행하는 단계라고 할 수 있다.
끝(End) -마무리 단계이다. 결과를 출력한다.
awk의 스크립트 구조는 시작, 실행, 마무리의 3단계로 나누어져 있따.
awk는 여러 연산자나 루프사용법 등이 c와 같아 c를 알고 있는 사용자라면 어려움 없이 사용할 수 있다.
다음의 스크립트는 파일의 단어 수를 검사한다. wc라는 명령어로 쉽게 단어 개수를 체크해 볼 수 있겠지만 여기서는 간단한 awk 스크립트 예제로 awk 스크립트 사용법을 알아보자.
작성된 스크립트는 -f 옵션으로 실행한다. wordrest.txt라는 임의의 텍스트 문서를 방금 작성한 스크립트로 검사해 보자. 작성된 awk 스크립트 파일을 실행하려면 awk -f [스크립트 파일 이름]형식으로 사용한다.
awk 시스템 변수
$0 입력 라인 모두
$n 입력 라인에서 n번째 필드 값
ARGC -명령 라인 인자 수를 갖는 변수
ARGV -명령 라인의 인자를 포함하는 배열
ENVIRON -환경변수들을 모아둔 관계형 배열
FILENAME -현재 파일명
FS구 -분자 정의, 공백을 기본으로 사용
FNR -입력파일의 레코딩 총수(라인 수)
NF -현재 레코드 필드 수
NR -현재 레코드 번호
OFMT -숫자에 대한 출력 포멧
OFS -출력 필드 구분, 빈 라인을 기본으로 사용
ORS -출력 레코드 구분 (newline을 기본으로 사용)
RLENGTH -지정한 페턴으로 검색되어 나온 문자열의 길이
RS -입력 레코드 구분 (newline을 기본으로 사용)
RSTART -지정한 패턴으로 검색되어 나온 문자열의 가장 앞부분
awk 연산자
c를 참조하여 만들어 졌으므로 c와 사용법이나 종류가 거의 같다.
? -조건연산
사용자로 등록된 아이디가 user1, user2, user3 로 되어있고 그 중 검색하고 싶은 내용이 1/2/3 중 어떤 것일지 명확하지 않을 경우 ?를 이용하여 모두 검색할 수 있다.
#awk /usr1?/ /etc/passwd/
user1:x:516:516::/home/usre1:/bin/bash
user1:x:516:517::/home/usre2:/bin/bash
user1:x:516:518::/home/usre2:/bin/bash
||, &&, ! -논리연산 or, and,not
~, !~ -검색된 패턴에 부함되는 것을 참으로 사용하려면 ~, 거짓으로 사용하려면 "!~"을 사용한다.
<, <=, >, >= ,!= ,== -비교연산자
+, -, *, /, %, ^ -더하기, 빼기, 곱하기, 나누기, 나머지, 제곱
++,-- -증가연산자, 감소연산자
사용법 : awk [옵션] -F'script' [변수=값] [파일]또는 awk [옵션] -f 스크립트 파일 [변수=값] [파일] 스크립트 파일 : awk 스크립트로 작성된 파일 변수 : awk 내의 변수를 지정한다. 파일 : 대상파일 -F : 구분자를 나타낸다. -F로 구분자를 지정하지 않을 경우에는 공백을 구분자로 사용한다. -f : 스크립트 파일을 이용할 경우 사용한다.
표준 입력으로 값을 받아 awk 스크립트를 통해 원하는 표준 출력을 얻어낸다.
awk는 1977년에 AT&T 연구소의 Alfred V.Aho, Peter J. Weinverger, Brain W. Kernighan 세 사람이 만들었다. awk라는 이름도 이 세 사람의 앞 글자로 만들어졌다. 리눅스에서는 1986년 Paul Rubin과 Jay Fenlason에 의해 GNU 버전의 awk가 만들어 졌다.
awk는 일정한 규칙을 가지고 있는 데이터를 처리하여 계산, 통계, 비교분석 혹은 필터링을 통한 데이터 추출 등에 다양하게 사용될 수 있다. sed와 비슷한 기능을 한다고 할 수 있으며 awk와 sed의 장점을 묶어서 만들어진 perl로 발전되었지만 단순한 구조의 데이터의 경우 더 효과적으로 쓰일 수 있어서 지금도 많이 사용되고 있다.
awk는 쉽고 유용하게 쓰일 수 있다. 단순히 명령어로 사용되거나 다른 스크립트에 sed와 함께 다른 스크립트에 이용될 수 있고 awk 만의 스크립트 파일의 작성도 가능하다.
명령어 사용
현재 디렉토리의 파일 정보를 보기 위해 ls -al 명령어를 이용하여 파일 목록을 출력한다. 이 목록 중 파일의 권한과 파일명만 보기를 원한다면 awk를 이용해 어렵지 않게 편집 할 수 있다. ls -al 명령으로 출력되는 데이터를 파이프 ( | )로 awk가 받아 파일의 공백을 기준으로 나누어 첫 번째 필드와 9 번째 필드를 출력한다.
# la -al drwxr-x--- 6 root root 4096 Mar 27 23:22 . drwx-----x 19 root root 4096 Mar 17 09:23 .. -rw-r--r-- 1 root root 578260811 Nov 12 00:17 anaconda-ks.cfg -rw------- 1 root root 5761641 Mar 27 10:34 .bash_history -rw-r--r-- 1 root root 33735 Jun 11 2000 .bash_logout -rw-r--r-- 1 root root 23376 Jul 6 2001 .bash_profile -rw-r--r-- 1 root root 4017 Aug 24 1995 .bashrc -rw-r--r-- 1 root root 1698368 Jun 11 2000 .cshrc
#ls -al | awk '{print $1, $9}' 합계 -rw-r--r-- anaconda-ks.cfg -rw------- .bash_history -rw-r--r-- .bash_logout -rw-r--r-- .bash_profile -rw-r--r-- .bashrc -rw-r--r-- .cshrc
awk로 필터링하여 파일의 권한과 파일명만 출력한다. 위와 같이 awk는 라인을 받아와 구분자를 통해 구분하고 print 명령으로 출력하게 된다.
ls -al로 출력되는 행을 공백으로 구분하면 아래와 같이 구분된 $1~$9 까지 필드이다 각 필드는 공백을 기준으로 아래와 같은 번호로 구분된다. $0은 모든 필드를 말한다.
파일권환$1 하드링크번호$2 사용자$3 그룹$4 용량$5 월$6 일$7 시간$8 파일명$9
파일 목록 중 1 Mb 이상의 용량을 갖는 파일명과 용량을 출력하고 싶다면 awk의 조건문을 사용하여 가능하다. 1Mb = 1048576bit 이기 때문에 용량을 나타내는 5번째 필드 중 1048576 보다 큰 라인을 출력하며 그 중 5 번째와 9번째 필드만 출력한다.
#la -al | awk '$5 > 1048576{print $5, $9}' 578260811 anaconda-ks.cfg 5761641 .bash_history 1698368 .cshrc
awk를 이요하면 문서의 특정 문자나 문자열을 검색하여 검색되어 나온 라인만 출력 할 수 있다.
# awk /root/ /etc/group root:x:0:root bin:x:1:boot,bin,daemon daemon:x:2:root,bin,daemon sys:x:3:root,bin,adm adm:x:4:root,adm,daemon disk:x:6:root wheel:x:10:root
root계정을 포함한 라이만 검색하여 출력하였다.
첫 번째 예제에서는 문자열 중 구분 되어 있는 필드를 지정하여 원하는 필드만 출력 하였고 두 번째 예제에서는 보기를 원하는 패턴을 가진 라인만 검색하여 출력하였다 이 두가지를 조합하면 보기를 원하는 라인에 특정 필드만 출력이 가능하다.
두 번째 예제는 /etc/group 파일을 root라는 패턴으로 검색하여 root라는 문자열을 포함한 라인만 출력되었다. ":표시로 구분지은 필드 중 제일 먼저 나오는 것이"그룹 명인데 다음 예제는 이 그룹명만 출력 되도록 만들었다.
-F는 구분자를 정의한 옵션으로 기본을 공백을 사용하지만 이 파일과 같이 "-F:"로 구분자를 지정해 사용할 수 있다.
#awk -F: /root/'{print $1}' /etc/group root bin daemon sys adm disk wheel
/root/로 검색한 패턴부분에, 정규 표현식을 사용하면 더욱 자세한 패턴을 검색할 수 있다.
스크립트 파일 이용
시작(Begin) -시작 단계로서 전체 스크립트를 위한 정의 단계이다. (Preprocessor)
실행(Routin) -실행단계로서 이 스크립트의 기능을 수행하는 단계라고 할 수 있다.
끝(End) -마무리 단계이다. 결과를 출력한다.
awk의 스크립트 구조는 시작, 실행, 마무리의 3단계로 나누어져 있따.
awk는 여러 연산자나 루프사용법 등이 c와 같아 c를 알고 있는 사용자라면 어려움 없이 사용할 수 있다.
다음의 스크립트는 파일의 단어 수를 검사한다. wc라는 명령어로 쉽게 단어 개수를 체크해 볼 수 있겠지만 여기서는 간단한 awk 스크립트 예제로 awk 스크립트 사용법을 알아보자.
[b]awk 스크립트[/b] #!/bin/awk -선언 : awk로 스크립트가 실행될수 있게 선언한다. Begin { word = 0; } -시작(Begin) : 변수 word를 0으로 초기화 한다. { word += NF; } -실행(Routin) : NF는 각 라인마디의 필드 수를 나타내는 awk시스템 변수이다. awk는 구분자가 정의되어 있지 않을 때 공백을 구분자로 사용 하므로 각 라인의 단어의 수가 NF로 들어가고 "+="연산자에 의해서 마지막 라인의 단어 갯수까지 더해 준다. END { print "Word Count:" word:(End) } -끝(End) : 마무리 단계이다. 결과를 출력한다.
작성된 스크립트는 -f 옵션으로 실행한다. wordrest.txt라는 임의의 텍스트 문서를 방금 작성한 스크립트로 검사해 보자. 작성된 awk 스크립트 파일을 실행하려면 awk -f [스크립트 파일 이름]형식으로 사용한다.
# awk -f word.awk wordcount.txt Word Count: 580
awk 시스템 변수
$0 입력 라인 모두
$n 입력 라인에서 n번째 필드 값
ARGC -명령 라인 인자 수를 갖는 변수
ARGV -명령 라인의 인자를 포함하는 배열
ENVIRON -환경변수들을 모아둔 관계형 배열
FILENAME -현재 파일명
FS구 -분자 정의, 공백을 기본으로 사용
FNR -입력파일의 레코딩 총수(라인 수)
NF -현재 레코드 필드 수
NR -현재 레코드 번호
OFMT -숫자에 대한 출력 포멧
OFS -출력 필드 구분, 빈 라인을 기본으로 사용
ORS -출력 레코드 구분 (newline을 기본으로 사용)
RLENGTH -지정한 페턴으로 검색되어 나온 문자열의 길이
RS -입력 레코드 구분 (newline을 기본으로 사용)
RSTART -지정한 패턴으로 검색되어 나온 문자열의 가장 앞부분
awk 연산자
c를 참조하여 만들어 졌으므로 c와 사용법이나 종류가 거의 같다.
? -조건연산
사용자로 등록된 아이디가 user1, user2, user3 로 되어있고 그 중 검색하고 싶은 내용이 1/2/3 중 어떤 것일지 명확하지 않을 경우 ?를 이용하여 모두 검색할 수 있다.
#awk /usr1?/ /etc/passwd/
user1:x:516:516::/home/usre1:/bin/bash
user1:x:516:517::/home/usre2:/bin/bash
user1:x:516:518::/home/usre2:/bin/bash
||, &&, ! -논리연산 or, and,not
~, !~ -검색된 패턴에 부함되는 것을 참으로 사용하려면 ~, 거짓으로 사용하려면 "!~"을 사용한다.
<, <=, >, >= ,!= ,== -비교연산자
+, -, *, /, %, ^ -더하기, 빼기, 곱하기, 나누기, 나머지, 제곱
++,-- -증가연산자, 감소연산자