1. awk ?
awk는 데이터 양식이나 문서나 혹은 자료를 처리하여 다른 형태의 문서 또는 결과물을 출력하는데 사용한다.
2. awk 의 구조
- 시작 (BEGIN) : 입력데이터를 실행하기에 적합한 형태로 바꾸어 주는 단계
- 실행 (Routine) : 잘 덩리된(정규화된) 데이터를 실제 루틴으로 처리하는 단계
- 종료 (END) : 데이터가 처리된 후에 결과의 추가 출력
3. awk 의 사용
일반적으로 grep 과 같이 사용된다.
1. grep 을 이용하여 데이터 파일의 구조 확인
2. 정규화가 가능하지를 확인하고 sed로 테스트 한후에 awk 가 처리할수 있을정도로
정규화되있다면 awk를 사용
3. sed로 정규화된 양식을 awk 로 처리
■■■■ ■■ ■■■■ ■ ■■■■■■■ ■
■■ ■■ ■■ ■■ ■■■■■■■■■ ■■
■■■■■■■■■■ ■■ ■■ ■■ ■ ■
위의 데이터 형식은 아래의 형식으로 바뀌게 된다.
R1 ■■■■ ■■ ■■■■ ■ ■■■■■■■ ■
R2 ■■ ■■ ■■ ■■ ■■■■■■■■■ ■■
R3 ■■■■■■■■■■ ■■ ■■ ■■ ■ ■
F1 F2 F3 F4 F5 F6
$1 $2 $3 $4 $5 $6
만약 awk 로 위의 데이터를 출력하면
awk '{print $1}' 위의데이터
■■■■
■■
■■■■■■■■■■
이렇게 출력된다.
awk [option] 'script' [file]
4. awk 의 옵션
-Fc : field separator 지정 (c 가 구분자이며 기본은 공백으로 설정)
-v 변수=값 : 스크립트를 실행하기 전에 미리 변수에 값을 지정
-f : 스크립트 파일을 지정
5. awk 의 응용
패턴 {동작}
커맨드 라인에서는 패턴, 동작 전체를 단일 따옴표(')로 묶어야 한다.
- 패턴만 있는 경우 : 패턴과 일치하는 라인을 화면에 출력
- 동작만 있는 경우 : 모든 라인이 동작의 대상이 됨
패턴
- /정규식표현/ : 정규식으로 표현된 패턴과 일치 여부
- 비교연산 : 숫자, 알파벳 모두 사용가능
- 패턴 매칭 연산 : ~ 일치하는 부분 , !~ 일치하지 않는 부분
- BEGIN : 첫번째 레코드가 읽혀지기 전에 어떤 동작을 정의
- END : 마지막 레코드가 모두 읽혀진 후에 어떤 동작을 정의
동작
- 동작은 모두 {}로 둘러싸야 한다.
시스템 변수
시스템 변수 |
설명
|
FILENAME |
현재 파일명
|
FS |
입력 필드 구분 기본 : 공백
|
NF |
현재 레코드 필드 갯수
|
NR |
현재 레코드 번호
|
OFMT |
숫자에 대한 출력 포맷 기본 : $.6g
|
OFS |
출력 필드 구분 기본 : 빈줄
|
ORS |
출력 레코드 구분 기본 : newline
|
RS |
입력 레코드 구분 기본 : newline
|
$0 |
입력 레코드
|
$n |
입력 레코드의 N번째 필드
|
ARGC |
커맨드 라인의 인자 개수
|
ARGV |
커맨드 라인 인자를 포함하는 배열
|
ENVIRON |
환경 변수들을 모아둔 관계형 배열
|
FNR |
NR과 동일 단지 현재 파일에 적용된다는 점이 다름
|
RSTART |
지정한 매칭 연산을 만족하는 문자열의 맨 앞부분
|
RLENGTH |
지정한 매칭 연산을 만족하는 문자열의 길이
|
연산자
산술연산자 |
=, +=, -=, *=, /=, %=
|
조건연산자
|
(condition)? (true) : (fales)
|
논리연산자 |
||, &&, !
|
패턴연산자 |
~, !~
|
비교연산자 |
<, <=, >, >=, !=, ==
|
증감연산자 |
++, --
|
필드참조 |
$ |
제어문
문법 자체는 C언어의 제어문과 같다.
- break
- continue
- do { Routine } while (condition)
- exit
- for ( init ; condition ; re ) { Routine }
- if ( condition ) { Routine } else { Routine }
- while (condition) { Routine }
- return
함수 - 문자열 함수
함수명 |
설명
|
gsub(r, s)
|
입력 문자열 전부에 걸쳐 정규식표현 r을 문자열 s로 치환한다.
|
gsub(r, s1, s2)
|
입력문자열 s2 에서 정규식 표현 r을 문자열 s1 으로 치환한다.
|
index(s1, s2)
|
s1에서 s2의 위치를 넘겨준다. 없다면 0
|
length(arg) |
인자의 길이를 넘겨준다.
|
match(s, r)
|
문자열 s에서 정규식표현 r과 매칭 되는 부분의 위치를 넘겨준다.
|
split(string, array[, seperator])
|
구분자를 기준으로(기본:공백)해서 지정한 문자열을 배열로 만든다.
|
sub(r, s) , sub(r, s1, s2)
|
gsub 와 동일 정규식식표현과 일치하는 문자열이 여러개라도 처음 한 문자열만 치환
|
substr(s, m)
|
문자열 s 에서 m번째 위치에서 끝까지 문자열을 넘겨준다.
|
substr(s, m, n)
|
문자열 s 에서 m번째 부터 n번째까지의 문자열을 넘겨준다
|
tolower(string) |
대문자를 소문자로 바꾼다.
|
toupper(string) |
소문자를 대분자로 바꾼다.
|
- 수학 함수
함수명 |
설명
|
atan2(x, y)
|
archtangent 값
|
cos(x)
|
cos 값
|
exp(x)
|
자연대수 e의 제곱
|
int(x)
|
정수형으로 반환
|
log(x)
|
로그
|
rand()
|
0에서 1까지의 랜덤수
|
sin(x)
|
sin 값
|
sqrt(x)
|
제곱근
|
srand(expr)
|
인자를 가진 난수(없으면 시간을 가지고 난수 발생)
|
- 입출력 함수
함수명 |
설명
|
close(filename)
|
지정한 파일을 닫는다.
|
close(cmd)
|
지정한 명령어 파이프를 닫는다.
|
delete array[element]
|
지정한 배열요소를 지운다.
|
getline()
|
다음 레코드를 읽어 들인다.
|
getline [variable] [< "filename"]
|
파일에서 읽어드린다.
|
next
|
다음 레코드를 입력받는다.
|
print [args] [> "filename"]
|
인자를 출력한다
|
printf "format" [,exp] [> "filename"]
|
형식에 맞춰 인자를 출력한다.
|
sprintf(format [,exp])
|
printf와 마찬가지로 사용되지만 값을 리턴하기만 하고 출력은 하지 않는다.
|
system(cmd)
|
시스템 내부 명령어를 실행한다.
|
6. 예문
1에서 10까지 출력
awk 'BEGIN { for (i = 1;i<=10;i++) print i }'
현재 디렉토리의 파일들이 이름만 출력
ls -al | awk '{print $9}'
연재 디렉토리의 파일 이름중에 소문자 알파벳이 포함된 파일명은 출력하지 않음
ls -al | awk '/^[a-z]/{ print $9 }'