[Alex] 데이터 장인의 블로그

[Linux] 데이터 엔지니어링을 위한 awk 명령어 정리 본문

Linux&OS

[Linux] 데이터 엔지니어링을 위한 awk 명령어 정리

Alex, Yoon 2021. 12. 11. 21:53

awk 명령어 

awk는 리눅스의 파일 및 데이터를 조작하고(1), 리포트를 생성(2)하기 위해 사용하는 언어입니다. 

기본명령어부터 정리하겠습니다. 


기본 사용법

ex) 파일 상태 (vi)

alex 데이터분석가 20200104
ALEX 데이터엔지니어 20200131

awk '{print $0}' [파일이름] -> 전체 추출

alex 데이터분석가 20200104
ALEX 데이터엔지니어 20200131

awk '{print $1}' [파일이름] -> 첫번째 단어 추출 $1 부터 시작 

alex
ALEX 

awk '{print $2}' [파일이름] -> 두번째 단어 추출 

데이터분석가 
데이터엔지니어 

awk '{print NR}' [파일이름] -> 파일레코드 출력 

1
2

awk '/20200104/' [파일이름] -> 해당 문자열이 포함된 전체 로우 출력 

alex 데이터분석가 20200104

awk '/20200104/{print '\t안녕, 난 '$1, $2'에요' [파일이름]

    -> /해당문자열/이 있는 로우를 찾고 그 해당 로우를 조건에 맞게 변형하여 출력 

안녕, 난 alex, 데이터분석가에요

여기까지 간단한 awk 사용법 정리였습니다. 


OFMT, printf 변수

awk 'BEGIN{OFMT="%.2f"; print 1.23412, 15E-3}' 

   -> OFMT 변수를 통해서 숫자 포맷을 제어.

1.23 0.01

awk '{printf  "저는 %-20s 입사일은 %10d입니다.\n", $1"("$2")", $3}' awkfile  

저는 alex(데이터분석가)         입사일은   20200104입니다.
저는 ALEX(데이터엔지니어)        입사일은   20200131입니다.
  • s : 문자열(붙여서 사용가능), c : 문자, d : 10진수, f : 실수, x : 16진수
  • %20s, %10d 각 소문자 앞에 숫자는 공백 숫자를 나타낸 것. 
    • -는 왼쪽으로 정렬하여 오른쪽 공백, 보통은 왼쪽부터 공백

파이프라인 활용 awk 사용법 (  |  ) 사용

df -h | awk '$4 > 10' -> 사용 가능한 용량이 10G 이상인 저장소를 나타냄

Filesystem      Size  Used Avail Use% Mounted on
udev             63G     0   63G   0% /dev
tmpfs            13G  2.7M   13G   1% /run
/dev/sdb2       453G  408G   22G  95% /
tmpfs            63G   40K   63G   1% /dev/shm
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
tmpfs            63G     0   63G   0% /sys/fs/cgroup
/dev/sdb1       511M  6.1M  505M   2% /boot/efi
tmpfs            13G   40K   13G   1% /run/user/1003
tmpfs            13G   40K   13G   1% /run/user/1005

Available 용량이 4번째에 나타내고 있으니 $4을 소환하여 비교문을 설정.

awk -f 옵션

$ vi awkcmd
{printf  "저는 %-20s 입사일은 %10d입니다.\n", $1"("$2")", $3}

실행방법 

awk -f awkcmd awkfile

필드분리자 ( FS )

빌트인 변수 FS는 입력 필드 분리자의 값을 가지고 있음.

default는 공백과 탭. 

FS 값을 변경하기 위해선 -F을 사용하며 -F 다음에 오는 문자가 새로운 필드 분리자가 됨

$ vi awkfile_FS
피카츄:디자이너 	2021-05
라이언:개발자   	 2021-06
$ awk -F: '/피/{print $1, $2}' awkfile
피카츄 디자이너         2021-05

$ awk -F'[ :\t]' '/피/{print $1,$2}' awkfile
피카츄 디자이너

-F 뒤에 구분자를 입력 (':' or '[ :\t]')하여 분리자 설정. 

비교 표현식

조건 표현식 

$ awk '{max={$1 > $2) ? $1 : $2; print max}' filename
if $1 > $2:
	max = $1
else:
	max = $2

논리 연산자

  • && : AND 연산
  • || : OR 연산
  • ! : NOT 연산
  $ awk '$3 > $5 && $3 <= 100' filename

정규표현식 사용방법 

awk '/ [정규표현식 입력] /' awkfile2 

# ex) 영어 정규표현식 활용 추출 
$ awk '/^[A-Z][a-z]+ /' awkfile2
> Hong KilgDong	3324	5/11/96	50354

# ex) : 2번 필드가 g로 끝나지 않는 라인 출력
$ awk '$2 !~ /g$/' awkfile2 
> Lee Seongkye	7654	6/20/58	60000

리다이렉션 

awk 결과를 리눅스 파일로 리다이렉션할 경우 쉘 리다이렉션 연산자 사용. 

파일명은 큰따옴표로 표현 

> 심볼이 사용될 때 파일이 오픈, 잘려짐.

$ awk -F: '$4 >= 60000 {print $1, $2 > "new_file"}' awkfile5

 

반응형
Comments