awk

출처

설명

입력을 주어진 분리자(field seperator)로 분리하여 명령을 처리합니다.

주요 옵션

옵션 설명
F 문자열을 분리할 기준이 되는 분리문자 입력
v 파라미터 전달

내장 함수

awk는 지정한 처리를 실행할 때 내장 함수를 이용할 수 있습니다.

함수 설명
sub 지정한 문자열 치환
gsub 문자열 일괄 치환
index 주어진 문자열과 일치하는 문자의 인덱스를 반환
length 문자열의 길이를 반환
substr 시작위치에서 주어진 길이 만큼의 문자열 반환
split 문자열을 분리하여 배열로 반환
print 문자열 출력
printf 지정한 포맷에 따라 함수 출력
system 명령 실행

print

$ echo "Hello World" | awk '{ print $0 }'
Hello World

$ echo "Hello World" | awk '{ print $1 }'
Hello

$ echo "Hello World" | awk '{ print $2 }'
World

$ echo "Hello,World" | awk -F "," '{ print $2 }'
World

sub

$ echo "i have a water." | awk -F " " '{ sub("a", "b", $4); print $4 }'
wbter.

gsub

$ echo "i have a water." | awk -F " " '{ gsub("a", "b"); print $1" "$2" "$3" "$4 }'
i hbve b wbter.

index

$ echo "i have a water." | awk -F " " '{ print index($4, "a") }'
2

length

$ echo "i have a water." | awk -F " " '{ print length($4) }'
6

substr

$ echo "1234567890" | awk -F " " '{ print substr($1, 3, 2) }'
34

split

$ echo "A/B/C/D/E/F/G" | awk -F " " '{ print split($1, array, "/");print array[1];print array[3]; }'
7
A
C

printf

$ echo | awk '{ printf("%.1f + %.2f = %.3f\n", 40.1, 20.2, 40.1 + 20.2); }'
40.1 + 20.20 = 60.300

system

# system으로 추가 명령어 실행 
$ echo "Hello World" | awk '{ system("echo "$1) }'
Hello

사용예제

그룹의 합 구하기

그룹의 합을 구하는 것은 배열을 이용합니다. 배열의 인덱스를 키로 사용하여 값을 모두 더하여 주고 마지막에 출력하면 됩니다.

$ cat sample.txt | awk '{ print $1 }'
a
b
a
c
c

$ cat sample.txt | awk '{ print $2 }'
1
2
4
1
2

$ cat sample.txt
a 1
b 2
a 4
c 1
c 2

$ cat sample.txt | awk '{ arr[$1] += $2 } END { for (i in arr) { print i, arr[i] } }'
a 5
b 2
c 3

합계(sum) 계산하기

합계는 지정한 인덱스의 값을 모두 더하여 구할 수 있습니다.

$ cat sample.txt | awk '{sum+=$2} END {print sum}' 
10

문자열 자르기

문자열을 자를때는 내장함수 substr을 이용합니다.

$ echo "1234567890" | awk -F " " '{ print substr($1, 3, 2) }'
34

파라미터 전달

awk에 파라미터를 전달 할 때는 v 옵션을 이용합니다. v 옵션과 함께 이름=값 형태로 전달하고 내장함수에서 사용하면 됩니다.

root="/webroot"  
$ echo | awk -v r=$root '{ print "shell root value - " r}'
shell root value - /webroot

links

social