1 / 20

Awk & gAwk ㈜ 다음소프트 200 5 년 1 2 월

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

santa
Download Presentation

Awk & gAwk ㈜ 다음소프트 200 5 년 1 2 월

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Awk & gAwk ㈜ 다음소프트 2005년 12월

  2. 순서 • 개요 • 프로그램 형식 • 연산자 및 예약어 • 내장 함수 • 내장 변수 • 예제 • 주의사항

  3. 개요 • 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 } • 주석 • #로 시작하는 라인

  4. 조건-액션 정의 • 예약된 조건 • BEGIN : 시작할 때 액션 영역이 실행됨 • END : 모든 입력 라인을 처리하고 나서 액션 영역이 실행됨 • 빈 조건 : 모든 입력 라인에 대해 액션 영역이 실행됨 • 사용자 정의 조건 • 각 라인에 대해 조건들을 평가하여 참인 조건에 해당하는 액션 영역이 실행됨 • 한 라인이 여러 개의 조건에 대해 참이면 각각의 액션 영역이 실행됨 • 액션 영역 • { }로 묶여짐 • 정의되지 않았을 경우에는 { print $0; }로 간주함 ($i < 3) { print $2; } /a+b/ { print $0; }

  5. 함수 정의 • 형식 • 예제 function 이름(파라메터들, 지역변수들) { 문장들 } function foo(a, b, i, sum) { sum=0; for (i=a; i<=b; i++) sum+=i; return sum; }

  6. 주요 연산자 및 예약어 • 조건 연산자 • <, <=, >, >=, ==, !=, &&, ||, ?: 등 • 수치 연산자 • +, -, *, /, %, 공백(스트링 결합), ++, --, ^(누승), ** • 패턴 연산자 • ~ /패턴/, !~ /패턴/ • 배열 연산자 • in • 주요 예약어 • if, else, while, for, do, break, continue, exit, delete(변수 제거) • BEGIN, END

  7. 주요 내장 변수 • 실행 인자 관련 • ARGC : 인자 개수 • ARGV : 인자 배열 • ARGIDX : 현재 처리되고 있는 인자의 인덱스 • FILENAME : 현재 입력으로 사용되고 있는 파일의 이름 • 레코드 및 필드 관련 • $0 : 현재 레코드 값 • $숫자 : 숫자번째 필드값 • NR : 현재 레코드 번호 • FNR : 현재 입력 파일 내에서 레코드의 번호 • NF : 현재 레코드의 필드 개수 • FIELDWIDTHS : 필드 길이가 고정일 때 각 필드의 길이를 공백으로 구분해서 지정 • 이 변수가 지정되어 있지 않으면 공백 문자로 필드가 구분됨 • 하나의 라인이 하나의 레코드로 간주되며, 각 라인에 대한 처리를 시작할 때 레코드(라인) 전체는 $0, 각 필드는 $1, $2,... $NF에 들어 있음 • RS : 레코드 구분 패턴(디폴트로 개행 문자 집합) • FS : 필드 구분 패턴(디폴트로 공백 문자 집합) • ORS : 출력용 레코드 구분자 • FS : 출력용 필드 구분자

  8. 주요 내장 변수-계속 • 패턴 매칭 관련 • RSTART : 패턴이 일치하는 시작 위치(일치하지 않으면 0) • RLENGTH : 패턴 일치 영역의 길이(일치하지 않으면 -1) • 기타 • SUBSEP : 다차원 배열 인덱스를 일차원 배열화할 때 사용되는 구분자 • awk에는 1차원 배열밖에 없으며, 다차원 배열은 1차원 배열을 이용하여 표현됨. • A[i, j, k]는 A[i SUBSEP j SUBSEP k] 로 처리됨 • ERRNO : geline(), close() 등을 호출하는 과정에서 발생한 시스템 오류 메시지 • ENVIRON : 현재 설정된 환경 변수들의 배열 • IGNORECASE : 스트링 및 패턴 비교시 대소문자 구분 여부

  9. 주요 내장 함수 • 스트링 처리 함수 • 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(숫자, 이동량)

  10. 주요 내장 함수-계속 • 패턴 처리 함수 • 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

  11. 주요 내장 함수-계속 • 입출력 함수 • 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 ... |& 명령

  12. 주요 내장 함수-계속 • 수치 함수 • 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

  13. 예제-로그 분석하기 • 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

  14. 예제-로그 분석하기 • 평균 응답시간 구하기 { 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

  15. 예제-배열을 구조체처럼 • config wizard에서 필드 정보 저장하는 구조체 gFieldInfo["number"] gFieldInfo[n, "name"] gFieldInfo[n, "type"] gFieldInfo[n, "option"] gFieldInfo[n, "size"] gFieldInfo[n, "indexing"]

  16. 예제-배열 출력하기 • 배열/구조체 출력하기 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 ...

  17. 예제-배열 출력하기(계속) • 배열/구조체 출력하기(정렬) 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]]); } }

  18. 예제-네트워크 이용 • 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); } }

  19. 주의사항 • 숫자와 문자 사이의 형 변환 시 의도와 다른 결과를 얻을 수도 있음 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

More Related