
이 글은 새롭게 시작되는 awk 튜토리얼 시리즈의 첫 번째 아티클입니다. 앞으로 몇 주에 걸쳐 awk의 모든 기능을 실용적인 예제와 함께 단계별로 다루는 글을 연재할 예정입니다.
이번 글에서는 awk의 기본적인 작동 방식을 살펴보고, 실무에서 바로 활용할 수 있는 7가지 awk print 예제를 소개합니다.
참고: 이전에 연재한 Sed 튜토리얼 시리즈도 함께 확인해 보시길 권합니다.
Awk 소개와 출력(Print) 연산
Awk는 구조화된 데이터를 손쉽게 조작하고 형식화된 보고서를 생성할 수 있게 해주는 프로그래밍 언어입니다. 'Awk'라는 이름은 저자 세 사람의 이름 첫 글자를 딴 것입니다. 즉, Aho(아호), Weinberger(와인버거), Kernighan(커니핸)을 의미합니다.
Awk는 주로 패턴 검색과 데이터 처리에 사용됩니다. 하나 또는 여러 개의 파일을 검색하여 지정한 패턴과 일치하는 라인을 찾아낸 후, 해당 라인에 대해 정의된 동작(action)을 수행합니다.
Awk의 주요 특징은 다음과 같습니다.
- Awk는 텍스트 파일을 레코드(record)와 필드(field) 단위로 인식합니다.
- 일반적인 프로그래밍 언어처럼 변수, 조건문, 반복문을 지원합니다.
- 산술 연산자와 문자열 연산자를 제공합니다.
- 형식화된 보고서를 생성할 수 있습니다.
Awk는 파일 또는 표준 입력(stdin)으로부터 데이터를 읽어 표준 출력(stdout)으로 내보냅니다. 단, 텍스트 형식이 아닌 파일에는 적합하지 않습니다.
Syntax:
awk '/search pattern1/ {Actions}
/search pattern2/ {Actions}' file
위 awk 문법의 구성 요소를 살펴보면 다음과 같습니다.
- search pattern: 정규표현식(regular expression)
- Actions: 수행할 문장(statement)
- Awk에서는 여러 개의 패턴과 동작을 자유롭게 조합할 수 있습니다.
- file: 입력 파일
- 프로그램 전체를 작은따옴표(')로 감싸면 셸이 특수 문자를 잘못 해석하는 것을 방지할 수 있습니다.
Awk의 작동 방식
- Awk는 입력 파일을 한 번에 한 라인씩 읽습니다.
- 각 라인에 대해 주어진 순서대로 패턴을 검사하고, 일치하면 해당 동작을 수행합니다.
- 일치하는 패턴이 없으면 어떤 동작도 수행하지 않습니다.
- 위 문법에서 search pattern과 action 중 하나는 생략할 수 있지만, 둘 다 생략할 수는 없습니다.
- 검색 패턴이 지정되지 않으면 Awk는 입력의 모든 라인에 대해 주어진 동작을 수행합니다.
- 동작이 지정되지 않으면 패턴과 일치하는 라인을 그대로 출력하는 것이 기본 동작입니다.
- 동작 없이 빈 중괄호({})만 있으면 아무것도 하지 않으며, 기본 출력 동작도 수행하지 않습니다.
- Actions 안의 각 문장은 세미콜론(;)으로 구분해야 합니다.
이제 아래 예제에서 사용할 employee.txt 파일을 먼저 만들어 보겠습니다.
$cat employee.txt 100 Thomas Manager Sales $5,000 200 Jason Developer Technology $5,500 300 Sanjay Sysadmin Technology $7,000 400 Nisha Manager Marketing $9,500 500 Randy DBA Technology $6,000
Awk 예제 1. Awk의 기본 동작
기본적으로 Awk는 파일의 모든 라인을 출력합니다.
$ awk '{print;}' employee.txt
100 Thomas Manager Sales $5,000
200 Jason Developer Technology $5,500
300 Sanjay Sysadmin Technology $7,000
400 Nisha Manager Marketing $9,500
500 Randy DBA Technology $6,000
위 예제에서는 검색 패턴이 지정되지 않았으므로, 동작이 모든 라인에 적용됩니다. print 동작에 인자를 지정하지 않으면 기본적으로 라인 전체를 출력합니다. 따라서 파일의 모든 라인이 그대로 출력됩니다. 동작(actions)은 반드시 중괄호 {} 안에 감싸야 합니다.
Awk 예제 2. 패턴과 일치하는 라인만 출력하기
$ awk '/Thomas/ > /Nisha/' employee.txt 100 Thomas Manager Sales $5,000 400 Nisha Manager Marketing $9,500
위 예제에서는 'Thomas' 또는 'Nisha'와 일치하는 모든 라인을 출력합니다. 두 개의 패턴이 사용되었는데, Awk는 임의 개수의 패턴을 받을 수 있습니다. 단, 각 패턴과 대응하는 동작의 묶음은 줄바꿈으로 구분해야 합니다.
Awk 예제 3. 특정 필드만 출력하기
Awk에는 여러 내장 변수가 있습니다. 각 레코드, 즉 각 라인에 대해 기본값으로 공백 문자를 기준으로 레코드를 분리한 뒤 $n 변수에 저장합니다. 라인에 단어가 4개 있다면 $1, $2, $3, $4에 저장되며, $0은 라인 전체를 나타냅니다. NF는 한 레코드의 전체 필드 개수를 나타내는 내장 변수입니다.
$ awk '{print $2,$5;}' employee.txt
Thomas $5,000
Jason $5,500
Sanjay $7,000
Nisha $9,500
Randy $6,000
$ awk '{print $2,$NF;}' employee.txt
Thomas $5,000
Jason $5,500
Sanjay $7,000
Nisha $9,500
Randy $6,000
위 예제에서 $2는 이름(Name), $5는 급여(Salary)를 나타냅니다. $NF는 마지막 필드를 의미하므로, 이 역시 급여를 가져오는 데 사용할 수 있습니다. print 문에서 ','는 문자열을 이어 붙이는 역할을 합니다.
Awk 예제 4. 초기화(BEGIN)와 마무리 동작(END)
Awk에는 BEGIN과 END라는 키워드로 지정되는 두 가지 중요한 패턴이 있습니다.
Syntax:
BEGIN { Actions}
{ACTION} # Action for everyline in a file
END { Actions }
# is for comments in Awk
BEGIN 섹션에 지정한 동작은 입력 라인을 읽기 시작하기 전에 실행됩니다. END 동작은 입력 라인의 읽기와 처리가 모두 끝난 후에 수행됩니다.
$ awk 'BEGIN {print "Name\tDesignation\tDepartment\tSalary";}
> {print $2,"\t",$3,"\t",$4,"\t",$NF;}
> END{print "Report Generated\n--------------";
> }' employee.txt
Name Designation Department Salary
Thomas Manager Sales $5,000
Jason Developer Technology $5,500
Sanjay Sysadmin Technology $7,000
Nisha Manager Marketing $9,500
Randy DBA Technology $6,000
Report Generated
--------------
위 예제에서는 보고서의 헤더와 마지막 종료 문구를 출력했습니다. 이처럼 BEGIN과 END 블록을 활용하면 깔끔한 형식의 보고서를 손쉽게 만들 수 있습니다.
Awk 예제 5. 사원 ID가 200보다 큰 직원 찾기
$ awk '$1 >200' employee.txt 300 Sanjay Sysadmin Technology $7,000 400 Nisha Manager Marketing $9,500 500 Randy DBA Technology $6,000
위 예제에서 첫 번째 필드($1)는 사원 ID입니다. 따라서 $1이 200보다 크면 기본 동작인 print가 수행되어 라인 전체가 출력됩니다.
Awk 예제 6. Technology 부서 직원 목록 출력하기
부서 이름은 네 번째 필드에 있으므로, $4가 "Technology" 문자열과 일치하는지 검사한 뒤 일치하면 해당 라인을 출력하면 됩니다.
$ awk '$4 ~/Technology/' employee.txt 200 Jason Developer Technology $5,500 300 Sanjay Sysadmin Technology $7,000 500 Randy DBA Technology $6,000
연산자 ~는 정규표현식과 비교할 때 사용합니다. 패턴이 일치하면 기본 동작인 라인 전체 출력이 수행됩니다.
Awk 예제 7. Technology 부서 직원 수 세기
아래 예제는 부서가 Technology인지 검사하고, 일치하면 count 변수를 1씩 증가시킵니다. 이 변수는 BEGIN 섹션에서 0으로 초기화됩니다.
$ awk 'BEGIN { count=0;}
$4 ~ /Technology/ { count++; }
END { print "Number of employees in Technology Dept =",count;}' employee.txt
Number of employees in Technology Dept = 3
모든 라인의 처리가 끝나면 END 블록에서 count 값을 출력하여 Technology 부서의 직원 수를 확인할 수 있습니다.
추천 도서
Ramesh Natarajan 저 『Sed and Awk 101 Hacks』. 필자는 매일 몇 시간씩 UNIX/Linux 환경에서 텍스트 파일(데이터, 설정, 로그 파일 등)을 다루며, 모든 텍스트 처리 작업에 Sed와 Awk를 활용하고 있습니다. 이러한 경험을 바탕으로 Sed와 Awk의 다양한 고급 기능을 담은 101가지 실용 예제를 수록한 eBook 『Sed and Awk 101 Hacks』를 집필했습니다. UNIX/Linux 작업 환경을 한 단계 업그레이드해 줄 유용한 내용이 가득합니다. Sed와 Awk를 오래 사용해 온 분이라도 이 책을 읽으면 새로운 가능성에 놀라게 될 것입니다.
함께 읽으면 좋은 Awk 관련 글
- 실용 예제 3가지로 배우는 Awk 사용자 정의 변수
- 강력한 Awk 내장 변수 8가지 – FS, OFS, RS, ORS, NR, NF, FILENAME, FNR
- Awk 연산자 7가지 예제 (단항, 이항, 산술, 문자열, 대입, 조건, 정규표현식 연산자)
- Awk If 문 4가지 예제 (if, if else, if else if, : ?)
- 반복문 완전 정복 – Awk While, Do While, For Loop, Break, Continue, Exit 예제