## 개요
`awk`명령어는 파일 / stdin 으로부터 전달받은 레코드를 파싱하여, 데이터화 해서 사용하는 도구이다.
역시 가볍고, 강력한 도구로 리눅스 시스템에서 많이 사용하며, 모두가 한번쯤은 사용해 봤을거라 믿는 그런 프로그램이다. 빠르게 awk 사용법에 대해서 숙지해 보자.
## Explanation
awk는 데이터를 파싱 / 데이터화 한다고 앞서 이야기했는데, 이는 전달받은 값을 줄 단위로 구분하여 레코드로 지정하고, 레코드 내를 필드로 파싱하게 된다. 필드의 파싱 기준은 공백이 될 수도 있고, 특정 문자가 될수도 있다. (지정이 가능하다) 무튼 이렇게 파싱된 데이터를 빠르게 데이터베이스에 질의하듯 사용할 수 있도록 해주는 프로그램으로 이해하면 되고, [[grep]]보다 좀더 복잡한 질의를 할수 있다는 점에서 grep과 같이 사용되기도 하는 도구이다.
## Usage
```
awk [OPTION] ‘pattern { action }‘ [ARGUMENT]
```
### Option
옵션은 우리가 프로그램을 사용할 때 보는 그 옵션이다.
다양한 옵션이 존재한다.
#### 주요 명령어들
- -F : 구분자 지정 `—-field-separator`
- -f : 스크립트 파일 지정 `—-source-file`
- -v : 변수 지정 `—assign var=val`
- -W :
#### 기타 명령어들
- -b
- -C
- -d
- -D
- -e
- -E
- -g
- -h
- -i
- -I
- -l
- -L
- -M
- -n
- -N
- -O
- -p
- -P
-
### awk program
앞서 좀더 복잡한 질의를 할수 있다는 말을 했는데, 코드 단위의 스크립트를 통해 복잡한 질의가 가능하다. 기본적으로 지원되는 형식은 C와 유사한 형태로 지원되며, 다음과 같은 명령어들이 사용이 가능하다.
```
BEGIN delete END function in printf
break do exit getline next return
continue else for if print while
```
### awk program functions
```
Arithmetic Functions :
atan2(y,x), cos(x), sin(x), exp(x), log(x), sqrt(x),
int(x), rand(), srand([expr])
String Functions :
gsub(ere, repl[, in]), index(s, t), length[([s])],
match(s, ere), split(s, a[, fs ]), sprintf(fmt, expr, expr, ...),
sub(ere, repl[, in ]), substr(s, m[, n ]), tolower(s),
toupper(s)
Input/Output and General Functions :
close(expression), getline getline var
system(expression)
```
## 결론
간단한듯 하면서도 복잡해 보이는 `awk`였다. 솔직히 awk language에 익숙해져 있는 사람들이 awk를 이용하여 로그 분석하는 걸 보면 차원이 다르다는걸 느낄 수 있다. [[로그 포렌식]]에서 꽤나 딥한 수준의 사용법을 다뤄볼 예정이니, 프로그램의 대략적인 이해를 가져가면 될 것 같다. (복잡한 예시는 직접 구글링해보는 편이 더 좋다)