Post

Linux awk

1. awk

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

2. 주요 옵션

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

3. 내장 함수

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

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

1) print

1
2
3
4
5
6
7
8
9
10
11
$ 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

2) sub

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

3) gsub

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

4) index

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

5) length

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

6) substr

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

7) split

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

8) printf

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

9) system

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

4. 사용예제

1) 그룹의 합 구하기

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

1
2
3
4
5
6
7
8
9
10
11
$ 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

2) 합계(sum) 계산하기

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

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

3) 문자열 자르기

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

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

4) 파라미터 전달

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

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

[출처 및 참고]

This post is licensed under CC BY 4.0 by the author.