본문 바로가기

Linux

awk 명령어

AWK는 유닉스에서 개발된 스크립트 언어로 파일로부터 레코드(record)를 선택하고, 선택된 레코드에 포함된 값을 조작하거나 데이터화하고 텍스트가 저장되어 있는 파일을원하는 대로 필터링하거나 추가해주거나 기타 가공을 통해서 나온 결과를 행과 열로 출력해주는 프로그램

awk [옵션] ‘pattern {action}’ [파일&변수값]

레코드 와 필드

레코드 : 행

필드 : 행 안의 데이터

레코드와 필드 활용

옵션

-u : 버퍼를 사용하지 않고 출력

-F : 필드 구분자 지정

awk -F : : 를 필드 구분자로 사용

awk -F’[:\t]’ : : 와 tab을 필드 구분자로 사용

-v : 스크립트 실행 전에 변수 지정

-f : awk명령 스크립트를 파일에서 읽어옴

패턴(patten)과 액션(action)

패턴 : 읽을 데이터

액션 : 동작 스크립팅

사용 예시

# -F : 필드 구분 문자를 공백 말고 ":" 로 설정
# pattern /linux/ : linux 문자열을 포함한 모든 레코드 출력
# action {print $1} : 각 행(레코드)에서 첫번째 필드를 출력 
$ awk -F":" '/linux/ {print $1}' test.txxt

패턴 생략시 : 모든 레코드 선택

액션 생략시 : 기본 액션인 print 실행

ℹ️
1. | 파이프 사용 가능
2. 비교연산 ( >, < 등 ), 정규표현식 (^[A-Z] 등 ), 매칭 연산(~, !) 사용 가능

 

특징

  1. awk는 개행문자를 지원하기 때문에 스크립트에서 가독성 좋게 작성이 가능하기 때문에 첫 행에 ‘ 를 쓰고 엔터를 누르면서 이어서 작성이 가능하다
$ awk '{
if ($3 >=35 && $4 >= 35 && $5 >= 35)
	print $0,"=>","Pass";
else
	print $0,"=>","Fail";
}' filename

$ awk \\ # \\문자를 써도 터미널에서 개행이 가능하다.
'
{
if ($3 >=35 && $4 >= 35 && $5 >= 35)
	print $0,"=>","Pass";
else
	print $0,"=>","Fail";
}
'
  1. awk 결과를 리눅스 파일로 리디렉션 할 경우 쉘 리디렉션 연산자를 사용할 수 있다 액션 부분에 > 기호가 쓰이면 리디렉션, 패턴에 쓰이면 논리 연산으로 쓰인다 또한, 파일명은 큰 따옴표 “ 로 둘러싸야 인식 된다
$ awk -F: '$4 >= 60000 {print $1, $2 > "new_file"}' awkfile5

내장 변수와 함수

내장 변수

FILENAME 현재 입력파일의 이름

$0 입력 레코드
$n 입력 레코드의 N번째 필드
ENVIRON 환경변수를 모아둔 관계형 배열
NR 출력 순번
NF 현재 줄의 필드수
ARGC 명령줄 인자의 개수
ARGV 명령줄 인자들의 배열
FNR 현재파일에서의 레코드 번호
FS 입력 필드 구분자
OFMT 숫자들의 표현형식
OFS 출력필드 구분자
ORS 출력 레코드 구분자
RS 입력코드 구분자
EP 서브스크립트의 구분자
RLENGTH match 함수로 일치하는 문자열의 길이
RSTART match 함수로 일치하는 문자열의 오프셋

문자열 함수

gsub(r, s) 입력 문자열 전부에 걸쳐 정규식표현 r을 문자열 s로 치환한다.

gsub(r, s1, s2) 입력문자열 s2 에서 정규식 표현 r을 문자열 s1 으로 치환한다.
index(s1, s2) s1에서 s2의 위치를 넘겨준다. 없다면 0
length(arg) 인자의 길이를 넘겨준다.
match(s, r) 문자열 s에서 정규식표현 r과 매칭 되는 부분의  위치를 넘겨준다.
split(string, array[, seperator]) 구분자를 기준으로(기본:공백)해서 지정한 문자열을  배열로 만든다.
sub(r, s) , sub(r, s1, s2) gsub 와 동일  정규식식표현과 일치하는 문자열이 여러개라도  처음 한 문자열만 치환
substr(s, m) 문자열 s 에서 m번째 위치에서 끝까지 문자열을  넘겨준다.
substr(s, m, n) 문자열 s 에서 m번째 부터 n번째까지의 문자열을 넘겨준다
tolower(string) 대문자를 소문자로 바꾼다.
toupper(string) 소문자를 대분자로 바꾼다.

입출력 함수

close(filename) 지정한 파일을 닫는다.

close(cmd) 지정한 명령어 파이프를 닫는다.
delete array[element] 지정한 배열요소를 지운다.
getline() 다음 레코드를 읽어 들인다.
getline [variable] [< "filename"] 파일에서 읽어드린다.
next 다음 레코드를 입력받는다.
print [args] [> "filename"] 인자를 출력한다
printf "format" [,exp] [> "filename"] 형식에 맞춰 인자를 출력한다.
sprintf(format [,exp]) printf와 마찬가지로 사용되지만 값을  리턴하기만 하고 출력은 하지 않는다.
system(cmd) 시스템 내부 명령어를 실행한다.

printf 포맷팅awk [옵션] ‘pattern {action}’ [파일&변수값]

'Linux' 카테고리의 다른 글

Ubuntu 22.04 LTS SSH접속 안될 때  (1) 2023.11.02
Ubuntu 절전모드 설정  (0) 2023.04.20
Ubuntu 추가 디스크 Mount  (0) 2023.04.20
리눅스 Logrotate  (1) 2023.04.17
wc 명령어  (0) 2023.04.15