1553 words
8 minutes
[commandline]awk & sd

개요#

데이터 엔지니어로써 제가 하는 대부분의 작업은 결국 어딘가에서 텍스트 데이터를 받아서 데이터를 처리하고 그 결과를 다시 어딘가로 내보내는 작업으로 단순화 할 수 있습니다. 흔히 ETL(Extract, Transform, Load)라고 불리는 이 작업은 데이터 엔지니어링의 파이프라인 구축의 핵심 컨셉이기도 합니다.

  • 대부분의 프로그래밍 문제는 텍스트를 처리하고 데이터를 매핑하는 작업으로 단순화할 수 있다.
  • ORM을 개선하는 것도 쿼리 생성(텍스트 처리)과 데이터를 객체에 매핑하는 작업이다.
  • 코드 하이라이터는 텍스트를 처리하는 대표적인 예이다.
  • 콘솔 프레임워크는 명령(텍스트)을 처리하고 적절한 출력(텍스트)을 생성하는 작업이다.
  • HTTP 요청 라우팅은 요청(텍스트)을 처리해, 최종적으로 텍스트를 반환하는 과정이다.
  • 템플릿 엔진도 결국 텍스트를 처리하는 것이다.
  • 특히 PHP 같은 언어로 웹 프로그래밍을 할 때, 대부분의 작업은 텍스트 처리와 데이터 이동이다.
  • 이렇게 단순화된 관점으로 보면 복잡한 문제들을 더 쉽게 이해하고 해결할 수 있다.

위의 인용은 제가 이 글을 쓰게 된 계기가 된 글의 요약입니다.

데이터와 텍스트 처리의 관점에서 보면, 현대의 소프트웨어 개발에서 가장 기본이 되는 Unix도 “모든 것은 파일(텍스트)이다”라는 원칙을 따르고 있으며, 이는 단순하면서도 강력한 시스템 설계의 기반이 되어왔습니다. 이와같은 원칙은 파이프라인 구축과 데이터 처리에서도 여전히 유효하며, 복잡한 시스템도 결국 텍스트의 입력과 출력의 연속으로 볼 수 있습니다.

이러한 관점에서 텍스트 데이터를 필터링하고 변환하고 분석하는 단순하지만 강력한 몇가지 도구들을 알고 있다면 복잡해보이는 데이터 처리 작업도 보다 쉽게 접근할 수 있습니다.

이 글에서는 Unix 환경에서 텍스트 데이터를 처리하는 대표적인 도구인 awk, sd에 대해 간단히 소개하고자 합니다.

awk#

awk는 텍스트 데이터를 레코드와 필드로 나누어 처리할 수 있는 스크립트 언어의 일종입니다.

기본적인 동작 방식은 다음과 같습니다.

Terminal window
awk 'pattern { action }' file
  • 입력을 레코드로 나누어 처리
  • 입력의 각 레코드들을 각 패턴에 대해 검사
  • 패턴이 입력과 일치하면 해당 레코드에 대해 action을 수행

awk 사용법#

이런 식의 텍스트 데이터가 주어졌다고 가정해봅시다.

Terminal window
cat awk.txt
지훈 90000 5/11/96 작가 서울
민준 100000 7/12/02 학생 부산
서현 287000 15/10/86 사업가 대구
하윤 10000 6/2/60 교수 광주
수아 190000 12/11/80 연구원 인천
유진 25000 1/3/94 디자이너 대전
태민 87000 20/8/90 개발자 울산
예슬 350000 14/4/85 마케터 수원
도현 150000 30/7/91 엔지니어 성남
  1. 필드 출력하기
Terminal window
# 직업 출력
cat awk.txt | awk '{print $5}'
# 이름 출력
cat awk.txt | awk '{print $2}'
  1. 패턴 매칭
Terminal window
awk '$6 == "서울" {count++} END {print "서울 사람:", count, "명"}' awk_ex.txt
  1. 필터링

3번째 필드가 200000 이상인 사람들의 이름과 직업 출력

Terminal window
awk '$3 >= 200000 {print $1 $2, $5, $6}' awk_ex.txt

특수한 변수들#

  1. NF : 현재 레코드의 필드 수
  2. NR : 현재 레코드의 번호
Terminal window
cat awk_ex.txt | awk '{print NR, NF}'
  1. FS : 필드 구분자

필드 구분자는 기본적으로는 공백이지만, -F 옵션을 통해 변경할 수 있습니다.

Terminal window
# 필드 구분자 변경
cat awk.txt | awk -F '/' '{print $2}'

sd#

sd는 sed(stream editor)라는 전통적인 치환 및 출력 도구의 대안으로 Rust로 작성된 CLI 툴입니다.

기본적인 동작 방식은 sed 명령어와 유사하지만 보다 더 직관적이고 inplace 치환을 지원합니다.

Terminal window
# 대상패턴, 치환, 파일
sd 'pattern' 'replacement' file

sd 사용법#

  1. 기본 사용법
Terminal window
echo 'dog is good' | sd 'dog' 'cat'
# cat is good
  1. 정규표현식 사용

패턴매칭 후 치환

Terminal window
echo 'I like "mango" and "guava"' | sd '"[^"]+"' 'X'
# I like X and X
  1. 파일에 적용하기
Terminal window
bat colors.txt
red orange
dark purple
blue green
sd 'red' 'green' colors.txt
green orange
dark purple
blue green

마무리#

여기서는 awk와 sd라는 두가지 텍스트 처리 도구만 소개했지만 실제 업무에서는 fzf, jq, xargs, sort, uniq, rq 등 보다 다양한 도구들을 조합해서 사용하게 됩니다. 또한 꼭 cli tool로 한정하지 않는다면 훨씬 다양한 도구들을 검토해 볼 수 있습니다. python 사용자라면 pandas, numpy, pyspark 등의 라이브러리를 사용할 수도 있고 자바 사용자라면 Lambda, Stream API를 사용할 수도 있습니다. 중요한 것은 어떤 도구를 사용하냐가 아니라 어떤 관점을 가지고 문제에 접근하느냐입니다.

우리가 받아서 처리하는 데이터를 결국 텍스트로 볼 수 있다면, 텍스트 처리에 대한 기본적인 이해가 데이터 처리 문제를 단순화하고, 보다 명확한 해결 방법을 찾는 데 도움을 줍니다. 이는 단순히 텍스트 처리 도구들의 사용법을 아는 것을 넘어서, 주어진 데이터를 이해하고 효율적인 처리 방법을 생각하는데 있어 중요한 인사이트를 제공할 수 있습니다.

추가로 찾아보면 좋은 키워드들#

  • piping in Unix
  • jq commandline
  • fzf commandline
  • 정규 표현식
  • 선언적 프로그래밍

Reference#

[commandline]awk & sd
https://yjinheon.netlify.app/posts/02de/cli-tools/de-cli-awk/
Author
Datamind
Published at
2025-01-15
License
CC BY-NC-SA 4.0