awk 스크립팅

## 기본 문법

```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
```

댓글

이 블로그의 인기 게시물

Session 대신 JWT를 사용하는 이유

스프링 부트 개발자를 위한 유용한 VSCode 설정

osx 매버릭스에서 영문키 반복 입력되게 하기