리눅스 awk 명령어 사용법
리눅스 | 2019년 11월 06일 17시 15분개요
awk 란 무슨 뜻이며, 어떠한 의미를 가지고 있을까?
사전적인 의미를 찾아보게 되었다. 이 유틸리티를 작성한 A.V.Aho, P.J. Weinberger, B. Kernigham의 머리글자를 따온 것이며, 일종의 프로그래밍 언어지만 일반적인 언어라기 보다는 주로 패턴의 검색과 조작을 주목적으로 만들어진 것이다.

다시말해서, 파일의 각 라인에서 필드(field)를 인식할 수 있는 패턴 매칭 기능을 가지고 이들 필드를 자유자재로 조작 가능한 유틸리티를 작성하고자 만든 것이다.
awk의 응용분야
데이터 프로세싱, 리포트 작성, 간단한 데이터베이스 구축, 등
awk를 이용한 작업
- 프로그래머가 자신이 작성한 프로그램의 입력 화일이 특정한 형식에 들어 맞게 이루어져 있는지 검사.
- 출력화일을 처리하여 리포트를 만들어 냄.
- 다른 프로그램의 입력 형식에 맞게 변환하는 작업에 이용.
awk 패턴 및 연산자, 변수 기타 변수 설명
awk 패턴
| 패 턴 | 내 용 |
| BEGIN | 입력화일을 읽어들이기 전에 옆에 제시되는 문자을 실행시키도록 한다. |
| END | awk가 모든 입력을 처리한 후, 옆에 제시되는 문장을 실행시키도록 한다. |
| expression | 식을 평가한 후 이 식이 참, 즉 non-zero이거나 non-null인 경우 문장을 실행한다. |
| /re/ | 정규식과 일치하는 문자열을 포함하고 있는 라인에서 문장을 실행한다. |
| compound-pattern | 복합패턴이라는 것으로 &&(and), ||(or) , !(not) 그리고 괄호에 의해 연결시킨 것이다. expression의 경우와 마찬가지로 복합 패턴도 참인 경우의 문장을 실행시킨다. |
| pattern1, pattern2 | 이러한 패턴을 범위 패턴이라한다. 현재 처리되고 있는 라인이 pattern1과 일치되고, 다음에 따라오 는 라인 중 임의의 라인이 pattern2와 일치할 때, 범위 패턴은 두 라인 사이의 각 라인과 일치한다. |
awk 연산자
| 연 산 자 | 내용 |
| = += -= *= /= %= | 배정(assignment)연산자 |
| + - * / % ++ -- | 산술 연산자 |
| || && ! | 논리 연산자(|| = OR, && = AND, ! = NOT) |
| > >= < <= == != | 비교 연산자 |
| v ~p | 변수 V가 패턴 P에 부합되면 참 |
| v !~p | 변수 V가 패턴 P에 부합되지 않으면 참 |
awk에서 미리 정의된 몇가지 변수들
- FILENAME - 현재 처리하고 있는 file의 이름
- FS Field Separator - 필드 구분자
- RS Record Separator - 레코드 구분자
- NF Number of Fields - 현재 레코드의 필드 수
- NR Number of Records - 현재 레코드의 번호
- $1 - 입력되는 Record의 첫 번째 필드
- $n - 입력되는 Record의 n 번째 필드
- OFS Output Fields Separator - 출력시의 FS. 이 값을 변경하게 되면, 출력시의 FS가 바뀌게 된다.
- ORS Output Records Separator - 출력시의 RS. 이 값을 변경하게 되면, 출력시의 RS가 바뀌게 된다.
일반적인 특수 문자
| Bar(|)의 왼쪽과 오른쪽의 논리적 OR 연산 + 선행하는 패턴의 하나 또는 그 이상의 반복 ? 선행하는 패턴이 없거나 또는 한번만 나타남을 의미 * 선행하는 패턴의 임의의 횟수의 반복 [] 대괄호([]) 사이의 임의의 문자 하나 [a-z] 두 문자 사이의 임의의 문자 하나 ^ 라인의 처음을 의미 $ 라인의 마지막을 의미 . Period 위치의 문자 하나 다음 문자의 특수한 의미를 없앰 () 패턴을 그룹화 함실전 명령어 사용방법
간단히 awk 의미에 대해서 확인해봤다. 지금부터는 간단히 실습을 통해 awk 명령어에 대해 자세히 확인해볼 것이다. 필드수를 구하는 명령어는 위에 설명한 것처럼 NF 명령어를 이용하면 된다.

awk '{print NF}' test.txt
테스트로 보여지는 test.txt 파일에 각각의 필드가 5개씩 있는걸 확인하였으며, 마지막 행의 경우 필드가 없기 때문에 0 으로 출력 된다.
이번에는 'swap' 이라는 단어가 포함된 필드를 검색하는 방법에 대해서 확인해 보자.

awk '/swap/' test.txt
명령어를 이용하여 test.txt 파일의 swap 이라는 단어가 포함된 필드를 출력된 모습이다.

for문 등 제어문을 사용할 수 있다.
변수 i는 1의 정수값(i=1)으로 시작하여 계속 1씩 증가(i++)한다. i 값이 레코드의 필드 수(NF)보다 작을 동안만 Action을 실행하는데, 출력될 필드도 변수 i 값에 맞추어 다르게 선정되는것이다. 결과적으로 모든 값이 출력 된다.
오늘은 리눅스 awk 명령어에 대해서 이정도만 설명하고 마치도록 한다.