## 기본 문법
```bash
awk options 'pattern {action}' file_name
```
- Options
- -F : field seperator
- -v : var=value
- -f : file
## 실습용 sample data
https://www.convertcsv.com/generate-test-data.htm#keywords
- 데이타 1 : 실습용 샘플
```
# sample1.txt
Maurice Fitzgerald 65 Male Kolbaim 9706
Stella Norman 37 Male Lelohip 8675
Frank Fleming 43 Female Bawzafvi 1086
Leroy Stewart 56 Female Naaglor 0001
Ronnie Perry 50 Female Izocecup 0746
Max Romero 41 Male Bizmuevi 4769
```
- data 2 : csv 파일, 콤마구분
```
# sample2.csv
seq,name/first,name/last,age,street,city,state,zip,dollar,pick,date
1,Gertrude,Hanson,51,Riffez Turnpike,Ridejpet,MT,67126,$1345.52,BLUE,10/11/1942
2,Katharine,Wade,36,Pemjo Square,Urmaolo,KS,91170,$3155.50,YELLOW,04/17/1945
3,Hester,Gray,28,Soco Path,Tapefdu,PA,72600,$5115.61,GREEN,06/23/1945
4,Jim,Torres,42,Bida Ridge,Kopehak,MI,01644,$2719.17,BLUE,02/12/1932
5,Sam,Harper,55,Acpe Trail,Arfewpu,OH,82412,$6127.11,YELLOW,05/26/2028
6,Aaron,Harrington,32,Ezmac Point,Puicke,NY,90061,$2198.40,GREEN,05/16/1978
7,Jeremiah,Lee,36,Pehbi Turnpike,Sokpulaw,ND,75691,$5755.56,WHITE,05/23/2040
8,Rachel,Gross,31,Lohug Circle,Higpepo,UT,85751,$8553.65,RED,09/26/2070
9,Eunice,Roberts,31,Nefi Ridge,Tiwdeavi,GA,54664,$664.85,GREEN,09/01/1990
10,Jeanette,Mendez,29,Dojez Lane,Buhveez,OK,69571,$1076.20,GREEN,01/30/2070
11,Warren,Carter,29,Lupaji Center,Udonikiz,DE,63769,$1829.74,RED,08/24/1995
```
## AWK가 동작하는 원리
- 기본 구분 값으로 ‘ ‘(공백)으로 각 필드(컬럼)을 구분한다
- 한 줄은 하나의 Row이다
- 각 필드는 순서에 따라 $1, $2, $3 … 와 같이 변수로 처리된다.
- $0 은 한 줄 전체를 나타낸다
- awk에서 사용되는 특별한 용어
- NR : 줄번호
- NF : 열번호
```
fields
f1 f2 f3 f4
row this is one row
row this is twor row
row this is three row
$1 $2 $3 $4
```
## 실습 1: 기본 사용법 sample.txt파일 사용
- 특정 컬럼만 출력하기
```bash
awk '{print $3}' sample1.txt
```
- 마지막 컬럼만 출력하기
```bash
# 마지막 컬럼 출력
awk '{print $NF}' sample1.txt
```
- 문자열 찾기
```bash
awk '/Norman/{print $0}' sample1.txt
```
- 특정 조건의 줄만 출력하기
```bash
awk 'NR==6{print NR, $0}' sample1.txt
```
- 각 줄의 처음에 줄 번호 넣기
```bash
awk '{print NR, $0}' sample1.txt
```
- 특정 컴럼에 주어진 문자가 들어 있는 줄만 출력하기
```bash
awk '$2 ~ /Norman/{print $0}' sample1.txt
```
- 여러단어 검색하기
```bash
awk '/Norman|Leroy/{print $0}' sample1.txt
```
- 지정한 줄 범위만 출력하기
```bash
awk 'NR==2,NR==4{print NR, $0}' sample1.txt
```
## AWK 구분자 지정하기
```bash
awk -F, '{print $2}' sample2.csv
```
## AWK 활용 예
- 서비스의 pid값만 조회하려 할 때
```bash
ps -ef | grep httpd
ps -ef | awk '/httpd/{print $2}'
```
- 파일 목록을 가져올 때 파일명만 조회
```bash
ls -l
ls -l | awk '{print $NF}'
ls -l | awk 'NR > 1 {print $NF}'
```
- 특정시간의 로그를 조회할 때
```bash
cd /var/log/cups
vi access_log
awk '$4 ~ /Nov/{print $0}' access_log
cd /var/log
vi system.log
awk '$3 >= "12:00:00" && $3 < "14:00:00" {print $0}' system.log
```
## AWK 스크립팅
- 기본 구조
```bash
awk 'BEGIN{start_action} pattern{action} END{}' file_name
```
- 사용예
```bash
awk 'BEGIN{print "----start----"} {print $0} END{print "---end---"}' sample1.txt
```
- awk 스크립팅에서 사용할 수 있는 프로그래밍 구문 기법들
- 변수선언
- if-else
- array
- for, while loop
- function
- awk 내장함수
- gsub(”a”, “b”) : a를 b로 바꾼다. replace
- longth($1) : 1번 컬럼의 길이를 구한다
- index($0, “abc”) : 특정단어의 시작위치값을 구한다
- tolower(), toupper() : 대소문자 변환
## -f 옵션을 사용하여 ‘pattern{action}’부분을 파일로 저장하여 이용하기
```bash
awk 'BEGIN{print "----start----"} {print $0} END{print "---end---"}' sample1.txt
```
```bash
# action.awk 파일에 아래와 같이 옮겨줄 수 있다.
#!/bin/awk -f
BEGIN{
print "----start----"
}
{
print $0
}
END{
print "---end---"
}
```
```bash
awk -f action.awk sample1.txt
```
## 실습2 : awk 스크립팅 파일 작성하기 (sample1.txt 파일 이용)
- 나이가 55이상인 남자 출력하고, 나이합 구하기
```bash
# action2.awk
#!/bin/awk -f
BEGIN{
sum=0
print "---start---"
}
{
if($3 >=55) sum+=$3
if($4=="Male")
$4="남"
else
$4="여"
print $0
}
END{
print "============"
print "55세이상 나이 합계 : ", sum
print "---end---"
}
```
```bash
awk -f action2.awk sample1.txt
```
- 원본은 바뀌지 않는다
```bash
cat sample1.txt
awk -f action2.awk sample1.txt &> result.txt
```
댓글
댓글 쓰기