본문 바로가기
장인으로의 여정

[linux] awk

by 유기농프로그래밍 2016. 1. 27.
반응형

awk


awk는 Alfred Aho, Pater Weinberger, Brian Kernighan 세명이 만들었다.

이 세 명의 이니셜 하나씩을 가져와서 awk로 명명했다.


[프로그래밍 형식]

awk는 패턴과 액션을 작은 따옴표로 둘러싸서 입력하며, 입력파일을 입력한다. 입력파일을 넣지 않을시에는 입력파일 대신 표준입력(stdin)으로 받는다.


1. 파일 입력

Hello!

Note

  • awk ‘pattern’ filename
  • awk ‘{action}’ filename
  • awk ‘pattern {action}’ filename



'/패턴/' : 패턴과 일치하는 줄을 출력한다.

'{print $1}' : 공백으로 나눠진 필드의 첫번째($1)를 출력


test_file

소프트웨어      1234 1111

장인            5678 2222

정신            9012 3333

글쓰기          3456 4444


[software-craftsman]# awk '/장/' test_file

장인            5678 2222


[software-craftsman]# awk '/장/ {print $1}' test_file
장인

[software-craftsman]# awk '/장/ {print $1, $2}' test_file
장인 5678

2. 명령어 입력
명령어로부터 입력을 받기 위해서 파이프를 사용할 수 있다.

Note

  • Command | awk ‘pattern’
  • Command | awk ‘{action}’
  • Command | awk ‘pattern {action}’

[software-craftsman]# cat test_file | awk '/장/'
장인            5678 2222

[software-craftsman]# cat test_file | awk '/장/ {print $2}'
5678

[software-craftsman]# cat test_file | awk '/장/ {print $1, $2}'
장인 5678

[software-craftsman]# cat test_file | awk '$2 > 5555'
장인            5678 2222
정신            9012 3333

분리자는 Default로 공백을 사용한다.

3. FS, OFS
FS : 필드 분리자로 Default는 공백(탭)이다. 다른 문자로 분리된다면 FS를 변경하면 된다.
OFS : {print $1,$2} 같이 출력할 때 ','로 나누어 준다. 이 때 ,는 출력시 공백으로 변경된다.

4. print 함수
간단하게 출력할 때 사용되는 함수이다. 중괄호({}) 안에 print가 들어가는데 아규먼트로 세가지가 들어갈 수 있다. 변수와 계산된 값, 문자열 상수이다. 문자열은 쌍따옴표("")로 둘러싸야한다. 

[software-craftsman]# date
2016. 01. 27. (수) 22:07:55 KST

[software-craftsman]# date | awk '{print "오늘 날짜는 " $1,$2,$3,$4"입니다."}'
오늘 날짜는 2016. 01. 27. (수)입니다.

Escape Char Mean
\b back space
\f form feed
\n newline
\r carriage return
\t tab
\022 octal 22
\c char

5. OFMT 변수

OFMT : Output ForMat, print 함수를 사용할 때 숫자의 출력 포멧을 제어할 수 있다. 기본 포멧은 %.6g이다. 이 포멧은 최대 전체 6자리를 가진다. "0."으로 시작하면 소수점 아래 6자리를, "0."이 아닌 숫자로 시작하면 전체 6자리를 출력하게 된다.


[software-craftsman]# awk 'BEGIN{print 1234.1234567890}'

1234.12


[software-craftsman]# awk 'BEGIN{OFMT="%.2f";print 1.1234567890}'

1.12



6. awk -f 옵션


Note

  • awk -f [awk 명령파일] [awk 명령을 적용할 텍스트 파일]


[software-craftsman]# cat command

{print "테스트합니다."}

{print $1, $2, $3}


[software-craftsman]# awk -f command test_file

테스트합니다.

소프트웨어 1234 1111

테스트합니다.

장인 5678 2222

테스트합니다.

정신 9012 3333

테스트합니다.

글쓰기 3456 4444


7. NR 변수
레코드들의 번호가 NR로 저장된다.

[software-craftsman]# cat test_file
소프트웨어      1234 1111
장인            5678 2222
정신            9012 3333
글쓰기          3456 4444
글쓰기          3456 4444
글쓰기          3456 4444
글쓰기          3456 4444

[software-craftsman]# awk '{print NR, $1}' test_file
1 소프트웨어
2 장인
3 정신
4 글쓰기
5 글쓰기
6 글쓰기
7 글쓰기

[software-craftsman]# awk '/글쓰기/{print NR, $1}' test_file
4 글쓰기
5 글쓰기
6 글쓰기
7 글쓰기


8. NF 변수

NF에 필드의 수를 유지한다. NF의 값은 Default 100이다.


즉, 필드가 아무리 많아도 Default에서 바꾸지 않았다면, $100까지만 사용가능하다는 것이다.


9. FS (필드 분리자)

FS(필드 분리자)의 값을 변경하기 위해서는 -F옵션을 사용해야한다.

-F 다음에 적어주는 문자가 새로운 필드 분리자가 된다.


[software-craftsman]# cat test_file

소프트웨어:1234:1111

장인:           5678 2222

정신:           9012 3333

글쓰기:         3456 4444


[software-craftsman]# cat test_file | awk -F':' '{print $1}'

소프트웨어

장인

정신

글쓰기


[software-craftsman]# cat test_file | awk -F':' '{print $2}'
1234
                5678 2222
                9012 3333
                3456 4444

10. 정규표현식

awk에서 정규표현식은 슬래시(/)로 둘러싸인 문자 패턴이다.

awk에서는 일반적인 정규표현식을 지원한다.

지원하지 않는 것은 아래 세가지이다.

1. \<\> : 단어

2. \(\) : 후위 참조

3. \{\} : 반복







반응형

'장인으로의 여정' 카테고리의 다른 글

[linux] cut  (0) 2016.02.22
[linux command] xxd  (0) 2016.01.21
[bash script] log_viewer.sh  (4) 2016.01.19

댓글