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) 부울 연산자
$ 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 카테고리 내 다른 글 보러가기
댓글 남기기