awk
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 동작 원리
- awk는 파일 또는 파이프를 통해 입력 라인을 얻어와 $0 이라는 내부 변수에 라인을 입력한다. 이때, 각 라인을 레코드라고 부르고, 개행에 의해 구분되며 패턴이 없으면 전체 라인을 불러오고 원하는 라인만 얻어오고 싶을 때는 패턴을 사용해 분별할 수 있다.
- 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)