200 likes | 330 Views
Awk & gAwk ㈜ 다음소프트 200 5 년 1 2 월. 순서. 개요 프로그램 형식 연산자 및 예약어 내장 함수 내장 변수 예제 주의사항. 개요. Awk Pattern scanning & processing language by Aho, Kernighan, and Weinberger 특징 C-style 의 문법 Line-oriented processing 강력한 텍스트 처리 및 패턴 매치 기능 느슨한 type checking 과 no type definition
E N D
Awk & gAwk ㈜ 다음소프트 2005년 12월
순서 • 개요 • 프로그램 형식 • 연산자 및 예약어 • 내장 함수 • 내장 변수 • 예제 • 주의사항
개요 • Awk • Pattern scanning & processing language by Aho, Kernighan, and Weinberger • 특징 • C-style의 문법 • Line-oriented processing • 강력한 텍스트 처리 및 패턴 매치 기능 • 느슨한 type checking과 no type definition • 자유로운 배열 첨자 및 차원 • One-based counting • 변수의 대소문자 구분 • 사용법 • awk [<option> …] <program-text> [<file> …] • awk [<option> …] –f <program-file> [-f <program-file> …] [<file> …] • 프로그램 구조 • 조건-액션 정의 • Condition { action statements } • 함수 정의 • Function name(parameter list) { statements } • 주석 • #로 시작하는 라인
조건-액션 정의 • 예약된 조건 • BEGIN : 시작할 때 액션 영역이 실행됨 • END : 모든 입력 라인을 처리하고 나서 액션 영역이 실행됨 • 빈 조건 : 모든 입력 라인에 대해 액션 영역이 실행됨 • 사용자 정의 조건 • 각 라인에 대해 조건들을 평가하여 참인 조건에 해당하는 액션 영역이 실행됨 • 한 라인이 여러 개의 조건에 대해 참이면 각각의 액션 영역이 실행됨 • 액션 영역 • { }로 묶여짐 • 정의되지 않았을 경우에는 { print $0; }로 간주함 ($i < 3) { print $2; } /a+b/ { print $0; }
함수 정의 • 형식 • 예제 function 이름(파라메터들, 지역변수들) { 문장들 } function foo(a, b, i, sum) { sum=0; for (i=a; i<=b; i++) sum+=i; return sum; }
주요 연산자 및 예약어 • 조건 연산자 • <, <=, >, >=, ==, !=, &&, ||, ?: 등 • 수치 연산자 • +, -, *, /, %, 공백(스트링 결합), ++, --, ^(누승), ** • 패턴 연산자 • ~ /패턴/, !~ /패턴/ • 배열 연산자 • in • 주요 예약어 • if, else, while, for, do, break, continue, exit, delete(변수 제거) • BEGIN, END
주요 내장 변수 • 실행 인자 관련 • ARGC : 인자 개수 • ARGV : 인자 배열 • ARGIDX : 현재 처리되고 있는 인자의 인덱스 • FILENAME : 현재 입력으로 사용되고 있는 파일의 이름 • 레코드 및 필드 관련 • $0 : 현재 레코드 값 • $숫자 : 숫자번째 필드값 • NR : 현재 레코드 번호 • FNR : 현재 입력 파일 내에서 레코드의 번호 • NF : 현재 레코드의 필드 개수 • FIELDWIDTHS : 필드 길이가 고정일 때 각 필드의 길이를 공백으로 구분해서 지정 • 이 변수가 지정되어 있지 않으면 공백 문자로 필드가 구분됨 • 하나의 라인이 하나의 레코드로 간주되며, 각 라인에 대한 처리를 시작할 때 레코드(라인) 전체는 $0, 각 필드는 $1, $2,... $NF에 들어 있음 • RS : 레코드 구분 패턴(디폴트로 개행 문자 집합) • FS : 필드 구분 패턴(디폴트로 공백 문자 집합) • ORS : 출력용 레코드 구분자 • FS : 출력용 필드 구분자
주요 내장 변수-계속 • 패턴 매칭 관련 • RSTART : 패턴이 일치하는 시작 위치(일치하지 않으면 0) • RLENGTH : 패턴 일치 영역의 길이(일치하지 않으면 -1) • 기타 • SUBSEP : 다차원 배열 인덱스를 일차원 배열화할 때 사용되는 구분자 • awk에는 1차원 배열밖에 없으며, 다차원 배열은 1차원 배열을 이용하여 표현됨. • A[i, j, k]는 A[i SUBSEP j SUBSEP k] 로 처리됨 • ERRNO : geline(), close() 등을 호출하는 과정에서 발생한 시스템 오류 메시지 • ENVIRON : 현재 설정된 환경 변수들의 배열 • IGNORECASE : 스트링 및 패턴 비교시 대소문자 구분 여부
주요 내장 함수 • 스트링 처리 함수 • length : length(스트링) • index : index(스트링, 스트링) • substr: substr(스트링, 시작인덱스[, 길이]) • split: split(스트링, 구분패턴[, 저장변수]) • tolower: tolower(스트링) • toupper : toupper(스트링) • strtonum : strtonum(스트링) • asort : asort(입력배열[, 출력배열]) • 비트 연산 함수 • and : and(숫자, 숫자) • or : or(숫자, 숫자) • xor : xor(숫자, 숫자) • comp : comp(숫자) • lshift : lshift(숫자, 이동량) • rshift : rshift(숫자, 이동량)
주요 내장 함수-계속 • 패턴 처리 함수 • gensub : gensub(패턴, 대체스트링, 대체 개수[, 스트링]) • “스트링”(혹은 $0)에서 “패턴”을 찾아 “대체 개수”(g이면 전체)만큼 “대체스트링”으로 변환한 결과를 반환 • 대체스트링의 특수 표현 • \숫자 : 패턴 내에서 “숫자”번째 () 영역에 매칭되는 부분 문자열 • gsub : gsub(패턴, 대체스트링[, 스트링]) • “스트링”(혹은 $0)에서 “패턴”을 찾아 모두 “대체스트링”으로 변환하고 그 개수를 반환 • match : match(스트링, 패턴[, 배열]) • “스트링”에서 “패턴”에 일치되는 영역의 시작 인덱스를 반환(불일치시에 0) • RSTART, RLENGTH에 패턴 일치 영역에 대한 정보가 기록됨 • 배열이 주어질 경우 배열[0]에는 패턴 전체에 매치되는 영역이 들어감 • 부분 패턴이 n개 있을 경우 배열[1]~[n]에 부분 패턴에 매칭되는 영역이 들어감 print gensub("([ab])([cd])", "\\2\\1", "g", "12ac34bc56ad78"); ---> 12ca34cb56da78
주요 내장 함수-계속 • 입출력 함수 • getline : 한 라인 읽기, getline [변수] [<파일명] • next : 다음 레코드에 대한 처리 시작 • nextfile : 다음 입력 파일에 대한 처리 시작 • close : 파일이나 파이프 닫기, close(파일[, “to”|”from”]) • print : print 출력 내용 [>파일명] • printf : printf(포맷[, 인자들...]) [>파일명] • sprintf : 변수=sprintf(포맷[, 인자들...]); • fflush : fflush([파일]) • system : system(명령) • 주요 파일 • /dev/stdin, /dev/stdout, /dev/stderr. /dev/fd/숫자 • /inet/tcp|udp|raw/로컬포트/원격IP/원격포트 • 파이프를 이용한 입출력 • 명령 | getline ..., 명령 |& getline ... • print ... | 명령, print ... |& 명령
주요 내장 함수-계속 • 수치 함수 • atan2, cos, exp, int, log, rand, sin, sqrt, srand • 시간 함수 • systime : systime() • 현재 시간(1970/01/01 00:00:00 를 기준으로 한 초 단위 오프셋)을 반환 • mktime : mktime(“YYYY MM DD HH MM SS”) • strftime : strftime([형식[,시각]) • 형식 : date 명령에서 사용하는 날짜 출력 형식 • 시각 : 1970/01/01 00:00:00 를 기준으로 한 초 단위 오프셋 print mktime("2005 12 29 11 53 23"); ---> 1135824803
예제-로그 분석하기 • Query Processor 로그 • 쿼리별 검색 결과 개수 추출하기 12:19:56 2 [18465:202] time=0.012355 code=0 query=난감한 화장실 12:19:56 2 [20927:0] time=0.005565 code=0 query=미대편입 과목 알아보려면. 12:19:57 2 [18459:704] time=0.017648 code=0 query=인형옷 12:19:57 2 [14125:13] time=0.019649 code=0 query=삼겹살 핸드폰줄 { if ((pos=index($0, “query=“))>0) { n=index($3, “:”); printf(“%s\t%d\n”, substr($0, pos+6), substr($3, n+1, length($3)-n-1)); } } 난감한 화장실202 미대편입 과목 알아보려면.0 인형옷704 삼겹살 핸드폰줄13
예제-로그 분석하기 • 평균 응답시간 구하기 { if (index($4, “time=“)==1) { request_number++; respond_time+=substr($4, 6); } } END { printf(“%d queries, avg %f secs\n”, request_number, respond_time/request_number); } 4 queries, avg 0.013804 secs
예제-배열을 구조체처럼 • config wizard에서 필드 정보 저장하는 구조체 gFieldInfo["number"] gFieldInfo[n, "name"] gFieldInfo[n, "type"] gFieldInfo[n, "option"] gFieldInfo[n, "size"] gFieldInfo[n, "indexing"]
예제-배열 출력하기 • 배열/구조체 출력하기 function DumpComplexVariable(x, name, idx, j) { printf("%s\n", name); for (idx in x) { n=split(idx, subscript, SUBSEP); printf("\t%s", name); for (j=1; j<=n; j++) printf("%s%s", (j==1)?"[":", ", subscript[j]); printf("]=%s\n", x[idx]); } } gVolumeInfo gVolumeInfo[0, Bridge]=0 gVolumeInfo[0, Indexer]=2 gVolumeInfo[0, cluster]=0 gVolumeInfo[0, name]=KS_s0_vol gVolumeInfo[0, searcher, 0]=4 gVolumeInfo[0, searcher, 1]=5 ...
예제-배열 출력하기(계속) • 배열/구조체 출력하기(정렬) function DumpComplexVariable(x, name, idx, i, j) { printf("%s\n", name); nItem=0; delete __a; for (idx in x) { nItem++; __a[nItem]=idx; } asort(__a); for (i=1; i<=nItem; i++) { n=split(__a[i], subscript, SUBSEP); printf("\t%s", name); for (j=1; j<=n; j++) printf("%s%s", (j==1)?"[":", ", subscript[j]); printf("]=%s\n", x[__a[i]]); } }
예제-네트워크 이용 • HTTP 접근 function BuildRequest(IP, Path, Query) { return "GET " Path "?query=" Query "&SortType=0&ResultType=0 HTTP/1.0\n” “Host: " IP"\n\n"; } BEGIN { IP="10.10.40.61"; Port=5380; Path="/search" HTTPServer="/inet/tcp/0/"IP"/"Port; printf("Query : "); while (getline>0) { Request=BuildRequest(IP, Path, $0); printf("Send Request\n%s", Request); printf("%s", Request) |& HTTPServer; while ((HTTPServer |& getline Respond)>0) printf("%s\n", Respond); printf("Query : "); close(HTTPServer); } }
주의사항 • 숫자와 문자 사이의 형 변환 시 의도와 다른 결과를 얻을 수도 있음 BEGIN { a="10"; b=2; printf("a=%d b=%d a-b=%d a>b=%d\n", a, b, a-b, a>b); } a=10 b=2 a-b=8 a>b=0