Awk
컴파일 없이 수행되는 프로그래밍 언어의 하나. 공동 개발자인 A. V. Aho, P. J. Weinberger, B. W. Kernighan 등 세 사람 이름의 첫 글자를 따서 지은 명칭이다. C언어와 같은 복잡한 언어가 실제로는 대부분 자료나 문서 정리와 같은 단순 작업에 사용됨에 착안하여, 좀 더 자료 처리에 편리하도록 단순화한 것이다. 입력 파일을 스캔한 후 미리 지정된 레코드 분리자(record separator) 단위로 읽어 필드 분리자(field separator)로 필드(field)마다 규칙적인 명칭을 붙인다. 기본 설정으로 레코드 분리자는 리턴(new line), 필드 분리자는 공백(blank)과 탭(tap)이며, 레코드 즉 전체 필드는 $0, 첫 번째 필드는 $1, 두 번째는 $2, ... 등으로 명명된다. 동작은 매번 레코드를 읽어 필드 속의 패턴(pattern)에 따라 프로그램된 액션(action)이 수행되는 단순한 구조로, 데이터 검사, 변환, 여러 포맷으로의 출력, 데이터베이스 구축 등에 활용된다.
Options
-
-F
- 필드 구분자를 지정한다.
- ex)
awk -F"." ' /txt/ { print "mv " $1 "." $2 " " $1 ".doc" } '
-
-v 변수=값
- 스크립트를 실행하기 전에 미리 변수에 값을 지정.
-
-f
- 스크립트 파일을 지정.
구조
- 시작 (BEGIN): 입력데이터를 실행하기에 적합한 형태로 바꾸어 주는 단계
- 실행 (Routine): 잘 덩리된(정규화된) 데이터를 실제 루틴으로 처리하는 단계
- 종료 (END): 데이터가 처리된 후에 결과의 추가 출력
내장 변수
시스템 변수 | 설명 |
FILENAME | 현재 파일명 |
FS | 입력 필드 구분 (기본값: |
NF | 현재 레코드 필드 갯수 |
NR | 현재 레코드 번호 |
OFMT | 숫자에 대한 출력 포맷 (기본값: |
OFS | 출력 필드 구분 (기본값: 빈줄) |
ORS | 출력 레코드 구분 (기본값: newline) |
RS | 입력 레코드 구분 (기본값: newline) |
$0 | 입력 레코드 |
$n | 입력 레코드의 N번째 필드 |
ARGC | 커맨드 라인의 인자 개수 |
ARGV | 커맨드 라인 인자를 포함하는 배열 |
ENVIRON | 환경 변수들을 모아둔 관계형 배열 |
FNR | NR과 동일. 단지 현재 파일에 적용된다는 점이 다름 |
RSTART | 지정한 매칭 연산을 만족하는 문자열의 맨 앞부분 |
RLENGTH | 지정한 매칭 연산을 만족하는 문자열의 길이 |
연산자
산술연산자 | |
조건연산자 | |
논리연산자 | |
패턴연산자 | |
비교연산자 | |
증감연산자 | |
필드참조 | |
제어문
-
break
-
continue
-
do { Routine } while (condition)
-
exit
-
for ( init ; condition ; re ) { Routine }
-
if ( condition ) { Routine } else { Routine }
-
while (condition) { Routine }
-
return
함수
문자열 함수
함수명 | 설명 |
| 입력 문자열 전부에 걸쳐 정규식표현 r을 문자열 s로 치환한다. |
| 입력문자열 s2 에서 정규식 표현 r을 문자열 s1 으로 치환한다. |
| s1에서 s2의 위치를 넘겨준다. 없다면 0 |
| 인자의 길이를 넘겨준다. |
| 문자열 s에서 정규식표현 r과 매칭 되는 부분의 위치를 넘겨준다. |
| 구분자를 기준으로(기본:공백)해서 지정한 문자열을 배열로 만든다. |
| gsub 와 동일 정규식식표현과 일치하는 문자열이 여러개라도 처음 한 문자열만 치환 |
| 문자열 s 에서 m번째 위치에서 끝까지 문자열을 넘겨준다. |
| 문자열 s 에서 m번째 부터 n번째까지의 문자열을 넘겨준다 |
| 대문자를 소문자로 바꾼다. |
| 소문자를 대분자로 바꾼다. |
수학 함수
함수명 | 설명 |
| archtangent 값 |
| cos 값 |
| 자연대수 e의 제곱 |
| 정수형으로 반환 |
| 로그 |
| 0에서 1까지의 랜덤수 |
| sin 값 |
| 제곱근 |
| 인자를 가진 난수(없으면 시간을 가지고 난수 발생) |
입출력 함수
함수명 | 설명 |
| 지정한 파일을 닫는다. |
| 지정한 명령어 파이프를 닫는다. |
| 지정한 배열요소를 지운다. |
| 다음 레코드를 읽어 들인다. |
| 파일에서 읽어드린다. |
| 다음 레코드를 입력받는다. |
| 인자를 출력한다 |
| 형식에 맞춰 인자를 출력한다. |
| printf와 마찬가지로 사용되지만 값을 리턴하기만 하고 출력은 하지 않는다. |
| 시스템 내부 명령어를 실행한다. |
여러 줄의 결과를 합치는 방법
다음의 도구를 사용하는 방법이 있다:
- bash - Concatenate lines given by grep -A - Stack Overflow
- sed#여러 줄의 결과를 합치는 방법
- awk#여러 줄의 결과를 합치는 방법
- tr#여러 줄의 결과를 합치는 방법
TODO |
테스트 해 봐야 한다 |
Example
GCC Include directory
GCC의 INCLUDE디렉터리 목록을 열람할 수 있는 bash샘플은 아래와 같다.
$ echo | gcc -Wp,-v -x c - -fsyntax-only 2>&1 \
| awk 'BEGIN{FS="[ \t]";RS="[\r\n]";s="#include <...> search starts here:";e="End of search list.";i=0;}{if($0!=""){if($0==e){i=0;}if(i==1){print($0);}if($0==s){i=1;}}}'
참고로 정리된 AWK 문법은 아래와 같다.
BEGIN {
FS = "[ \t]";
RS = "[\r\n]";
s = "#include <...> search starts here:";
e = "End of search list.";
i = 0;
}
{
if ($0 != "") {
if ($0 == e) {
i = 0;
}
if (i == 1) {
print($0);
}
if ($0 == s) {
i = 1;
}
}
}
END {
}
Column print
Text Processing Commands
|
See also
Favorite site
- Wikipedia (en) awk에 대한 설명
- The GNU Awk User's Guide 1
- AWK사용법
- Wikibooks: GNU Awk 사용자 가이드/함수
- IBM 기술자료: AWK 언어 소개 2
- IBM 기술자료: 초보자를 위한 유닉스 팁과 기교, Part 3: 필터와 정규 표현식: 명령행에서 awk 사용하기 3
- KLDP AWK에 대한 설명 4
- AWK의 자세한 사용법 5
- AWK & SED chunk_1 6
- 파일 이름을 일괄적으로 바꾸기 (
([a-z]+)-([0-9]+).([a-z]+)
와 같은 형식) - AWK 쉘 프로그래밍 7
Tutorials
- [추천] AWK script 가이드 - mug896 8 (archive)