[Shell] 06. awk

Date:     Updated:

카테고리:

태그:


01) awk


awk는 패턴 매칭과 프로그래밍 기능을 결합한 명령어로, 입력을 필드나 레코드 단위로 분리하고 조건에 따라 출력하거나 가공할 수 있다.


a) 명령 형식

awk [option] 'program' filename
옵션 설명
-f awk 프로그램 파일을 사용하기 위해 사용한다. (예: -f 프로그램 파일명)
-F 입력 필드 구분자를 정의하기 위해 사용한다. 기본 필드 구분자는 스페이스이다. (예: -F: )
-v 변수를 선언하기 위해 사용한다. (예: -v 변수명=값)
예약된 변수 설명
FS 입력 필드 구분자 (기본 스페이스)
RS 입력 레코드 구분자 (기본 줄바꿈)
OFS 출력 필드 구분자 (기본 스페이스)
ORS 출력 필드 그룹 구분자 (기본 줄바꿈)
NR 입력된 총 레코드(Record) 수 (레코드는 입력 줄로 생각하면 이해하기 쉬움)
NF 입력된 레코드의 총 필드 수
$1 첫 번째 필드값
$n n번째 필드값


b) awk 프로그램 구조

Block 설명
BEGIN 입력의 첫 레코드(행, 줄)을 읽기 전 실행되어야 하는 사항들을 정의합니다. (예: 변수 선언, 스크립트 설명 문 등)
BODY 패턴에 일치하는 모든 입력 레코드가 action에 의해 처리됩니다. BODY라는 키워드를 사용할 필요는 없습니다.
END awk 프로그램 종료 전 처리되어야 되는 사항들을 정의합니다.


c) 명령 예시

# 01
$ df -hPF ext4
Filesystem                         Size  Used Avail Use% Mounted on
/dev/mapper/ubuntu--vg-ubuntu--lv  9.8G  4.8G  4.6G  51% /
/dev/sda2                          1.8G  130M  1.5G   8% /boot

# 내용 출력 - awk '{print}' file.txt
$ df -hPF ext4 | awk '{print}'
Filesystem                         Size  Used Avail Use% Mounted on
/dev/mapper/ubuntu--vg-ubuntu--lv  9.8G  4.8G  4.6G  51% /
/dev/sda2                          1.8G  130M  1.5G   8% /boot

# 패턴 매칭 - awk '/pattern/ {print}' file.txt
$ df -hPF ext4 | awk '/boot/ {print}'
/dev/sda2                          1.8G  130M  1.5G   8% /boot

# 필드 추출 - awk -F' ' '{print $1, $3}' file.txt
$ df -hPF ext4 | awk '/boot/ {print $1, $NF}'
/dev/sda2 /boot

# 변수 사용 - awk -v var=3 '{print $1 * var}' file.txt
# > 위 명령어는 file.txt 파일에서 첫 번째 필드를 추출하고, 이를 3과 곱하여 출력합니다. var 변수를 -v 옵션으로 지정하였다.
$ df -hPF ext4 | awk -v var=3 '/boot/ {print $2 * var}'
5.4
# 02
$ head -5 /etc/passwd | awk '{print}'
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync

$ head -5 /etc/passwd | awk '/^root/ {print}'
root:x:0:0:root:/root:/bin/bash

$ head -5 /etc/passwd | awk -F: '/^root/ {print "Username : "$1"\nDefault Shell : "$NF}'
Username : root
Default Shell : /bin/bash
# 03 - awk 스크립트 파일로 처리하는 예
$ cat disk_total.awk
BEGIN {
      print "\n----- STORAGE TOTAL USAGE INFO -----\n"
}

{
      SIZE += $2;USED += $3
}

END {
      print "Total Capacity \t= " SIZE/1024 " MBytes"
      print "USAGE \t\t= " USED/1024 " MBytes"
      print "\n----- END -----\n"
}

$ df -hPF ext4 | tail -n +2 | awk -f disk_total.awk

----- STORAGE TOTAL USAGE INFO -----

Total Capacity  = 0.0113281 MBytes
USAGE           = 0.131641 MBytes

----- END -----


d) escape sequences

시퀀스 설명
\a ASCII BEL 문자
\b 백스페이스
\n 개행
\t 수평 Tab
\v 수직 Tab
$ awk -F: '$1 ~ /root/ {print "\nUsername : "$1"\nHome Directory : "$6"\tDefault Shell : "$7}' /etc/passwd

Username : root
Home Directory : /root  Default Shell : /bin/bash


e) 산술 연산자

연산자 설명
+ 덧셈
- 뺄셈
* 곱셈
/ 나눗셈
% 나머지
^ 거듭제곱
$ cat arith.awk
BEGIN { print "\nArithmetic Operators\n" }

{
  print "A + B = "$1 + $2
  print "A - B = "$1 - $2
  print "A * B = "$1 * $2
  print "A / B = "$1 / $2
  print "A % B = "$1 % $2
  print "A ^ B = "$1 ^ $2
}

END { print "\n-------END------"}

$ echo 2 4 | awk -f arith.awk

Arithmetic Operators

A + B = 6
A - B = -2
A * B = 8
A / B = 0.5
A % B = 2
A ^ B = 16

-------END------


f) 할당 연산자

연산자 설명
++ 변수에 1씩 더한다.
변수에 1씩 뺀다.
+= 덧셈 결과를 할당한다.
-= 뺄셈 결과를 할당한다.
*= 곱셈 결과를 할당한다.
/= 나눗셈 결과를 할당한다.
%= 나머지 결과를 할당한다.
^= 거듭제곱근 결과를 할당한다.
$ head -5 /etc/passwd | awk 'BEGIN { X = 1 } { print X++ }'
1
2
3
4
5

$ df -kP / /boot
Filesystem                        1024-blocks    Used Available Capacity Mounted on
/dev/mapper/ubuntu--vg-ubuntu--lv    10218772 4935408   4742692      51% /
/dev/sda2                             1790136  132944   1547932       8% /boot

$ df -kP / /boot | tail -n +2 | awk '{SUM += $2} END {print "Tatal capacity : "SUM/1024^2" GB"}'
Tatal capacity : 11.4526 GB


g) 관계 연산자

연산자 설명
< 보다 작은
> 보다 큰
<= 같거나 작은
>= 같거나 큰
== 같은
!= 같지 않은
~ 일치하는
! 일치하지 않는
$ head -5 /etc/passwd | awk -F: '$7 ~ "/bin/bash" {print "Default Shell of "$1" user is "$7}'
Default Shell of root user is /bin/bash

$ echo 2 3 | awk '$1 < $2 {print $1 " less than "$2}'
2 less than 3


h) 부울 연산자

연산자 설명    
&& AND    
      OR
! NOT    
$ echo 2 3 | awk '$1 > 1 && $2 >1 {print $1 " and "$2 " great than 1"}'
2 and 3 great than 1

$ date '+%u' | awk '$1 == 2 || $1 == 5 {print "We need to backup data"}'
We need to backup data

BASH 카테고리 내 다른 글 보러가기

댓글 남기기