Files
kui-vault/02.Volume/Linux-Unix/필터(Filter).md
T

3.5 KiB

id, created, tags
id created tags
필터(Filter) 20260407 2026-04-07 15:32

[!note] 유닉스 철학에서 말하는 **필터(Filter)**는 단순히 무엇을 걸러내는 장치를 넘어, 데이터의 흐름을 가공하는 독립적인 작업 단위를 의미합니다. 유닉스의 철학과 필터

1. 필터의 3대 구성 요소 (표준 스트림)

필터가 되기 위해서는 입구와 출구가 표준화되어야 합니다. 유닉스는 이를 **표준 스트림(Standard Streams)**으로 해결합니다.

  • 표준 입력(stdin): 데이터를 받아들이는 입구. 보통 키보드나 앞선 프로그램의 결과물입니다.

  • 표준 출력(stdout): 가공된 데이터를 내보내는 출구. 보통 화면(터미널)이나 다음 프로그램의 입구로 연결됩니다.

  • 표준 에러(stderr): 작업 중 발생한 문제를 알리는 별도의 통로입니다.

2. 필터의 주요 작업 유형

말씀하신 것처럼 단순히 제거만 하는 게 아니라, 데이터를 다음과 같이 주무르는 모든 행위가 필터링에 해당합니다.

  • 선택(Selection): 특정 조건에 맞는 행만 남기기 (예: grep "S-OIL" log.txt)

  • 변형(Transformation): 데이터의 형식을 바꾸기 (예: 소문자를 대문자로 바꾸는 tr, 특정 열만 추출하는 cut)

  • 정렬(Ordering): 순서대로 나열하기 (예: sort)

  • 요약(Summarization): 데이터의 통계를 내기 (예: 줄 수를 세는 wc)

3. 필터 철학의 강력함: 조합(Composition)

필터 하나는 아주 단순한 일만 하지만, 이들을 파이프(|) 로 연결하면 복잡한 문제를 순식간에 해결할 수 있습니다.

예시: 로그 파일에서 오늘 발생한 오류 개수 찾기 cat server.log | grep "2026-04-07" | grep "ERROR" | wc -l

  1. 파일 읽기(cat) ➔ 2. 날짜 필터링(grep) ➔ 3. 오류 필터링(grep) ➔ 4. 개수 세기(wc)

이 과정에서 각 프로그램은 서로의 내부 로직을 전혀 몰라도 됩니다. 오직 텍스트라는 공통의 언어로만 소통하기 때문입니다.

[!note] 결국 필터는 단순한 거름망이 아니라 데이터 변환기로 봐야한다.

1. Input/Output이 모두 문자열(Text)인 이유

유닉스 철학의 거장 더글라스 맥일로이는 데이터는 텍스트여야 한다고 강조했습니다.

  • 범용성: 텍스트는 사람이 읽을 수 있고, 거의 모든 프로그램이 해석할 수 있는 가장 단순한 인터페이스입니다.

  • 결합의 자유: A 프로그램의 출력이 텍스트고 B의 입력이 텍스트라면, 두 프로그램이 서로 무엇인지 몰라도 **파이프(|)**로 연결할 수 있습니다.

  • KISS 원칙의 실천: 복잡한 바이너리 구조나 특정 객체 타입을 맞출 필요가 없으므로 설계가 극도로 단순해집니다.

2. 필터는 곧 변환기(Transformer)

필터라는 단어에 매몰되지 않고 변환기로 확장해서 이해하신 것이 이 철학의 정수를 꿰뚫으신 겁니다.

  • 데이터의 형태 변화: CSVJSON으로 바꾸거나, 소문자대문자로 바꾸는 것도 유닉스 입장에서는 필터링입니다.

  • 데이터의 의미 추출: 1,000줄의 로그에서 오직 에러 코드만 뽑아내는 것도 변환의 일종입니다.

  • 연쇄 작용: 변환기(필터)들을 여러 개 이어 붙이면, 마치 공장의 컨베이어 벨트처럼 데이터가 흐르면서 최종 결과물로 가공됩니다.