본문 바로가기

공학속의 배움/UNIX

[펌] awk 정리

awk는 자료 처리 및 리포트 생성에 사용하는 프로그래밍 언어이다.

 

Alfred Aho, Brian Kernighan, Peter Weinberger 세 사람의 성의 첫 글자

 

awk 'pattern' filename

awk '{action}' filename

awk 'pattern {action}' filename

 

awk '$0 ~ /Tom/ {print $0}' filename

 

$0 하나의 레코드

 

OFMT

ORS(Output Record Separator) - 출력 레코드 구분자

OFS(Output Field Separator) - 출력 필드 구분자

NF(Number of fields) - 필드번호

NR(Number of Record) - 레코드번호

 

 

match연산자는 ~(tilde), 반대 !~

 

※관계 연산자

<, <=, ==, !=, >, ~, !~

 

※조건식

conditional expression1 ? expression2 : expression3

 

{

if(expression1)

   expression2

else

   expression3

}

awk '{max=($1>$2)?$1:$2;print max}' filename

 

※산술계산

모든 산술 계산을 부동소수점으로 변환한 후 처리

+ - * / % ^

 

※복합패턴

&&, ||, !

 

※범위패턴

awk '/Tom/,/Suzanne/' filename

첫 번째 패턴은 찾았으나 두 번째 패턴을 찾지 못하면 파일의 마지막 행까지 출력

 

문자열은 반드시 "(따옴표)를 사용.

 

※대입연산자

=, +=, -=, *=, /=, %=, ^=

 

※증가,감소연산자

x++, x--, ++x, --x

 

※명령행에서 사용자 정의 변수 사용

awk -F: -f awkscript month=4 yea=2001 filename

 

※-v옵션

명령행 인자가 BEGIN문에서 처리될 수 있도록 한다.

명령행으로부터 전달되는 각 인자 옆에 -v 옵션을 먼저 넣어야 한다.

 

※내장변수

대문자로 이루어져 있다.
ARGC     - 명령행 인자의 개수
ARGV     - 명령행 인자의 배열
FILENAME - 현재 입력 파일의 이름
FNR      - 현재 파일의 레코드 개수
NF       - 현재 레코드의 필드 개수
NR       - 지금까지의 레코드 개수
FS       - 입력 필드 구분자 

             명령행에서 변경 -F

             두 개 이상일 때는 -F'[ :\t]'

RS       - 입력 레코드 구분자
OFMT     - 숫자를 위한 출력 서식
OFS      - 출력 필드 구분자
ORS      - 출력 레코드 구분자
RLENGTH  - match함수가 찾은 일치하는 문자열 길이
RSTART   - match 함수가 찾은 문자열의 위치
SUBSEP   - 배열 요소 구분자

 

※BEGIN패턴

BEGIN패턴에는 awk가 입력 파일을 처리하기 전에 수행해야 할 동작들을 지정한 블록이 따라온다.

실제로 awk는 BEGIN의 동작 블록이 수행되기 전까지는 입력 파일을 읽지 않는다.

awk 'BEGIN{FS=":";OFS="\t";ORS="\n\n"} {print $1, $2, $3} ' file

 

※END패턴

입력 행에 대해 패턴을 검색하지는 않지만 END패턴에 따라나오는 동작들을 실행

모든 입력 행의 처리가 끝난 후에 END패턴이 처리

 

awk '$4 >= 70 {print $1, $2, > "passing_file"}' filename

네 번째 필드의 값이 70보다 크면 첫 번째와 두 번째 필드의 내용이 passing_file로 출력된다.

 

※입력 리다이렉션

getline함수

표준입력이나 파이프 혹인 다른 파일로부터 입력을 받을 때 사용한다.

입력 레코드가 있으면 1을 반환, EOF는 0, -1은 에러.

 

awk 'BEGIN{printf "What is your name?";getline name < "/dev/tty"} \

$1 ~ name { print "Found" name on line ", NR "."}\

END {print "See ya, " name "."}' filename

 

awk 'BEGIN{while (getline < "/etc/passwd" > 0) lc++;print lc}' file

 

awk '{print $1, $2 | "sort -r +1 -2 +0 -1"} ' filename

 

close("sort -r +1 -2 +0 -1")

유닉스 명령어는 반드시 "(따옴표)

 

※system함수

system("UNIX Command")

 

※조건문

if/else/else if

 

※루프

while, do/while, for, for(item in arrayname)

 

※루프제어

break, continue

next

 

exit (0~255)

 

※배열

name[x++]=$2

 

※split함수

split(문자열,배열,필드구분자)

split(문자열,배열)

 

※delete함수

배열요소 삭제 - delete line[x]

 

※ARGV, ARGC

ARGV첨자는 0부터 시작

  0                     1             2           3

awk -f argvs datafile "Peter Pan" 12

 

※delete ARGV[2]

 

※문자열 함수

sub(정규표현식, 치환문자열)

sub(정규표현식, 치환문자열, 대상문자열)

 

gsub(정규표현식, 치환문자열)

gsub(정규표현식, 치환문자열, 대상문자열)

 

index(문자열, 부분문자열)

 

length(문자열)

 

substr(문자열, 시작위치)

substr(문자열, 시작위치, 문자열길이)

 

match(문자열, 정규표현식) 찾을수 없으면 0, RSTART(패턴 시작위치), 부분문자열의 길이(RLENGTH)

 

split(문자열, 배열, 필드구분자)

split(문자열, 배열)

 

variable=sprintf("string with format specifiers ", expr1, expr2, ..., expr3)

 

※내장 산술 함수

atan2(x,y) x/y의 역탄젠트

cos(x)

exp(x) x의 지수함수

int(x) x의 정수부

log(x) x의 자연로그

rand() 0 < r < 1 사이의 나수 r

sin(x)

sprt(x) x의 제곱근

srand(x) rand() 함수를 위한 시드(sed) x


[출처 : http://nsj0409.blog.me/20111841193]

'공학속의 배움 > UNIX' 카테고리의 다른 글

tail 명령어 사용법  (0) 2011.08.10
head 명령어 사용법  (0) 2011.08.10
tee 명령어 사용법  (0) 2011.08.09
Less 명령어 사용법  (0) 2011.08.09
cat 명령어 사용법  (0) 2011.08.09