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 |