Awk 기본

awk 이용

awk란 이름은 이 유틸리티를 작성한 A.V.Aho, P.J. Weinberger, B. Kernigham의 머리글자를 따온 것으로 주로 패턴의 검색과 조작을 주목적으로 만들어진 것이다. 즉 파일의 각 줄에 필드(field)를 인식할 수 있는 패턴 매칭 기능을 가지고 이들 필드를 자유자재로 조작 가능한 유틸리티를 작성하고자 만든 것이다.

awk 패턴 매칭

awk pattern {action} filenames
awk -f parttern-action-file filenames

  • filenames: 입력화일 awk실행 action을 가진 프로그램 file

패턴내용

| 패턴 | 설명 |
| —————— | ——————————————————————————————————————————————————————————————– | — | ————————————————————————————————————————— |
| BEGIN | 입력화일을 읽어들이기 전에 옆에 제시되는 문자을 실행시키도록 한다. |
| END | awk가 모든 입력을 처리한 후, 옆에 제시되는 문장을 실행시키도록 한다. |
| expression | 식을 평가한 후 이 식이 참, 즉 non-zero이거나 non-null인 경우 문장을 실행한다. |
| /re/ | 정규식과 일치하는 문자열을 포함하고 있는 라인에서 문장을 실행한다. |
| compound-pattern | 복합패턴이라는 것으로 &&(and), | | (or) , !(not) 그리고 괄호에 의해 연결시킨 것이다. expression의 경우와 마찬가지로 복합 패턴도 참인 경우의 문장을 실행시킨다. |
| pattern1, pattern2 | 이러한 패턴을 범위 패턴이라 한다. 현재 처리되고 있는 라인이 pattern1과 일치되고, 다음에 따라오 는 라인 중 임의의 라인이 pattern2와 일치할 때, 범위 패턴은 두 라인 사이의 각 라인과 일치한다. |

awk에서 찾은 내용은 다음 변수에 저장되어 있다.

변수 내 용
FILENAME 현재 처리되고 있는 입력 파일의 이름
FS 입력 필드 분리문자
NR 현재 레코드(행)의 번호
NF 현재 레코드(행)의 필드의 갯수
OFS 출력되는 필드의 분리문자

auth.log 패턴 분석

1
2
Apr 16 06:43:04 homepi sshd[20198]: User root from 222.73.37.31 not allowed because not listed in AllowUsers
Apr 16 06:43:07 homepi sshd[20198]: Failed password for invalid user root from 222.73.37.31 port 41030 ssh2

sshd 접속하는 root 접속 요청을 찾으려면,

1
awk '/sshd|root/' /var/log/auth.log      # sshd,root 가 있는 줄을 출력

찾은 결과의 특정 컬럼만 출력 가능하다:

1
$ awk '/sshd|Failed/ {print $13}' /var/log/auth.log
1
$ awk '{print "Number of fields: " NF}' /var/log/auth.log

로그인 실패한 root 사용자가 사용하는 IP만을 추출하고자 한다면,

Apr 16 06:43:07 homepi sshd[20198]: Failed password for invalid user root from 222.73.37.31 port 41030 ssh2

1
2
$ awk '/Failed password/ {print $13,":",$15 }' /var/log/auth.log
222.73.37.31 : 49415

위 결과를 정렬하면, 같은 IP들이 징렬되어 나열된다.

1
2
3
4
5
6
awk '/Failed password/ {print $13,":",$15 }' /var/log/auth.log | sort ```

이 겹치는 결과에서 하나의 IP만 식별하고, 반복된 숫자를 출력하고, 정렬한다.

```sh
awk '/Failed password/ {print $13,":",$15 }' /var/log/auth.log | sort | uniq -c | sort -n
1
2
3
4
5
6
7
8
9
10
11
12
awk '/^north/' datafile    # north로 시작하는 줄 출력
awk '/^(no | so)/' datafile : no 또는 so 로 시작하는 줄 출력


awk '$5 ~ /\.[7-9]+/' datafile : 다섯 번째 필드가 마침표 다음엣 7과 9사이 숫자가 하나 이상 나오는 레코드 출력
awk '$2 !~ /E/ { print $1, $2 }' datafile : 두 번째 필드에 E 패턴이 없는 레코드의 첫 번째와 두 번째 필드 출력
awk '$3 ~ /^Joel/{ print $3 " is a nice guy."} ' datafile : 세 번째 필드가 Joel로 시작하면 " is a nice guy"와 함께 출력
awk '$8 ~ /[0-9][0-9]$/ { print $8 }' datafile : 여덟 번째 필드가 두 개의 숫자이면 그 필드가 출력
awk '$4 ~ /Chin$/ { print "The price is $" $8 "." }' datafile : 네 번째 필드가 Chine으로 끝나면 "The price is $" 8번 필드 및 마침표가 출력
awk -F: '{ print $1 } ' datafile : -F 옵션은 입력 필드를 ':'로 구별.
awk -F"[ :]" '{ print $1, $2 } ' datafile : 입력 필드로 스페이스와 ':'를 필드 구별자로 사용
awk -f awk_script.file datafile : -f 옵션은 awk 스크립트 파일 사용할 때 씀.

auth.log 에 있는 잘못된 로그인 정보만 출력

1
2
awk '(/sshd|invalid/){print $(NF-5)}' /var/log/auth.log
awk '(/sshd|invalid/){print $13}' /var/log/auth.log

연산자

| 연산자 | 설명 |
| —————– | ———————————— | —- | ———— | — | ———————— |
| = += -= *= /= %= | 배정(assignment)연산자 |
| + - * / % ++ – | 산술 연산자 |
| | | && ! | 논리 연산자( | | = OR, && = AND, ! = NOT) |
| >>= < <= == != | 비교 연산자 |
| v p | 변수 V가 패턴 P에 부합되면 참 |
| v !
p | 변수 V가 패턴 P에 부합되지 않으면 참 |

1
2
3
4
5
6
awk '$7 == 5' datafile : 7번 필드가 5와 같다면 출력
awk '$2 == "CT" { print $1, $2 }' datafile : 2번 필드가 "CT" 문자와 같으면 1, 2 번 필드 출력
awk '$7 < 5 { print $4, $7}' datafile : 7번 필드가 5보다 작다면 4번, 7번 필드 출력
awk '$6 > .9 { print $1, $6}' datafile : 6번 필드가 .9 보다 크다면 1번, 6번 출력
awk '$8 > 10 && $8 < 17 ' datafile
awk '$2 == "NW" || $1 ~ /south/ { print $1, $2 }' datafile

액션

awk pattern {action} filenames

① expressions
② print expression-list
③ printf(format, expression-list)
④ if (expression) statement
⑤ if (expression) statement else statement
⑥ while (expression) statement
⑦ for (expression; expression; expression) statement
⑧ for (variable in array) statement
⑨ do statement while (expression)
⑩ break
⑪ continue
⑫ next
⑬ exit
⑭ exit expression
⑮ {statement}

참조

Author

Gangtai Goh

Posted on

2018-05-19

Updated on

2023-05-14

Licensed under