Linux

awk

진공청소ㄱl 2024. 8. 21. 18:09

awk (Aho Weinberger Kernighan) 개념

awk 는 텍스트가 저장되어 있는 파일을 원하는 대로 필터링하거나 추가해주거나 기타 가공을 통해서 나온 결과를 행과 열로 출력해주는 프로그램 이다.

 

좀 더 쉽게 말하자면, awk는 "awk programming language" 라는프로그래밍 언어로 작성된 프로그램을실행 하는 명령어라고 이해하면 좋다.

 

즉, 리눅스에서 쉘 스크립트(Shell Script)로 작성된 파일이 리눅스 쉘(Shell)에 의해 실행되는 것처럼, awk가 "awk programming language"문법으로 작성된 코드를 이해하고 실행한다는 의미로 보면 된다.

 

awk 기본 형식과 주요 옵션

$ awk [옵션] 'pattern { action }' [파일|변수값]

      OPTION
        -F        : 필드 구분 문자 지정 (기본값 공백)
        -f        : awk program 파일 경로 지정. (awk 스크립트를 파일에서 읽어온다)
        -v        : awk program에서 사용될 특정 variable값 지정.

 

pattern과 action은 모두 생략이 가능한데, pattern을 생략하는 경우는 "모든 레코드"가 적용되고, action을 생략하면 "print"가 적용된다.

awk 동작 원리

  1. awk는 파일 또는 파이프를 통해 입력 라인을 얻어와 $0 이라는 내부 변수에 라인을 입력한다. 이때, 각 라인을 레코드라고 부르고, 개행에 의해 구분되며 패턴이 없으면 전체 라인을 불러오고 원하는 라인만 얻어오고 싶을 때는 패턴을 사용해 분별할 수 있다.
  2. awk를 실행할 때 내장 변수인 FS라고 부르는 필드 분리자가 공백을 할당 받는다.그러면 awk는 라인을 공백을 기준으로 각각의 필드나 단어로 나눈다. (-F 옵션을 통해 필드 분리 기준을 공백이 아닌 다른 값으로 바꿀 수 있다.) 
### 다음과 같은 하나의 행을 예로 들자면
### 기본 값인 공백을 기준으로 하였을 때, $1=hong $2=28se $3=011-222-2222 $4=seoul이 된다.
### 또한 $0은 전체 행인 hong 28se 011-222-2222 seoul을 의미한다.
    
hong 28se 011-222-2222 seoul

3.  각 필드 데이터들을 저장했다면 awk는 액션을 통해 동작 스크립팅을 할 수 있다.

awk 패턴

awkTest.text

hong 28se 011-222-2222 seoul

park 34se 017-333-3333 kyunggi

im 23se 019-444-4444 chungnam

son 49se 016-555-5555 us

gil 19se 018-666-6666 korea

jang 21se 011-7777-7777 japan

lee 16se 016-8888-8888 china

sa 45se 017-9999-9999 canada

hwang 32se 015-555-5555 kwangju

패턴1 && 패턴2

$1 필드가 hong이면서 $2 필드가 28se인 행을 출력

# awk '$1=="hong" && $2=="28se" {print}' awkTest.text

hong 28se 011-222-2222 seoul

 

{print}는 다음과 같이 생략이 가능하다

awk '$1=="hong" && $2=="28se" ' awkTest.text

 

또한 지금은 {print} 부분에 아무 필드도 적어주지 않았기 때문에 모든 필드가 출력되었지만,

특정 필드만 지정하여서 출력할 수 있다.

awk '$1=="hong" && $2=="28se" {print $3}' awkTest.text

011-222-2222

패턴1 || 패턴2

$1 필드가 hong이거나 $2 필드가 28se인 행을 출력

awk '$1=="hong" || $2=="34se" {print}' awkTest.text

hong 28se 011-222-2222 seoul
park 34se 017-333-3333 kyunggi

!패턴

$1 필드가 hong이 아닌 행을 출력

awk '$1!="hong" {print}' awkTest.text

park 34se 017-333-3333 kyunggi
im 23se 019-444-4444 chungnam
son 49se 016-555-5555 us
gil 19se 018-666-6666 korea
jang 21se 011-7777-7777 japan
lee 16se 016-8888-8888 china
sa 45se 017-9999-9999 canada
hwang 32se 015-555-5555 kwangju

정규 표현식

“pa” 로 시작하는 라인을 골라서 출력

awk '/^pa/{print}' awkTest.text

 

BEGIN/END 패턴

BEGIN: 특정 명령을 실행하기 전에 먼저 실행시킨다.

END: 특정 명령을 실행한 후 제시되는 문장 실행

 

name: 출력 후 $3 필드 출력 후 phone: 출력

awk 'BEGIN {print "name:"} {print $3} END {print "phone:"}' awkTest.text

name:
011-222-2222

017-333-3333

019-444-4444

016-555-5555

018-666-6666

011-7777-7777

016-8888-8888

017-9999-9999

015-555-5555

phone:

 

awk는 그 기능이 생각보다 방대하고 다른 명령어들과의 호환성도 높아 다양한 용도로 활용된다.

아직은 지식이 얕아, 기초적인 부분만 정리하였지만, awk의 문법과 사용법은 매우 다양하다.

기본적인 사용법을 익힌 후에는, 더 깊이 있는 학습을 위해 다른 블로그나 자료를 참조하는 것이 좋을 것 같다.

 

참고

🐧 AWK 명령어 문법 마스터 💯 총정리 (tistory.com)

리눅스 awk 명령어 사용법. (Linux awk command) - 리눅스 파일 텍스트 데이터 검사, 조작, 출력. :: 개발자를 위한 레시피 (tistory.com)

[Linux] 리눅스 명령어 - awk (tistory.com)