iBetter Books
수정

파이프라인

리눅스 설계 철학 중 하나는 "한 가지 일을 잘 하는 작은 도구들을 연결하라"입니다. 파이프(|)가 바로 이 연결 고리입니다. 앞 명령어의 stdout이 뒤 명령어의 stdin으로 자동 연결됩니다.

파이프의 동작 원리

파이프라인 동작 원리

각 명령어는 독립적인 프로세스로 실행되며, 커널이 이들 사이에서 데이터를 전달합니다. 앞 명령어가 데이터를 만들어내는 속도에 맞춰 뒤 명령어가 바로바로 처리합니다.

기본 파이프 사용

# 현재 디렉토리의 파일 수 세기ls | wc -l
12
# 실행 중인 프로세스에서 특정 프로세스 찾기ps aux | grep nginx
www-data  1234  0.0  0.1  55680  2048 ?  Ss  09:00  0:00 nginx: master process
www-data  1235  0.0  0.1  55680  1024 ?  S   09:00  0:00 nginx: worker process
ubuntu    5678  0.0  0.0   6432   724 pts/0 S+ 09:15  0:00 grep nginx
# .txt 파일만 골라서 개수 세기ls -la | grep ".txt" | wc -l
3

파이프라인이 길어질수록 읽기 어려울 수 있습니다. 여러 줄로 나눠 쓰면 가독성이 좋아집니다.

ls -la \  | grep ".txt" \  | sort -k5 -n \  | tail -5

줄 끝의 \(백슬래시)는 다음 줄이 같은 명령어의 연속임을 알려줍니다.

sort, uniq, wc — 데이터 가공

파이프라인에서 자주 사용하는 도구들입니다.

# 파일 내용 정렬sort names.txt
Alice
Bob
Charlie
# 중복 제거 (정렬 후 사용해야 함)sort names.txt | uniq
Alice
Bob
Charlie
# 각 항목의 출현 횟수 세기sort access.log | uniq -c | sort -rn | head -10
   523 GET /index.html
   312 GET /about.html
   201 POST /api/login
# 줄 수, 단어 수, 바이트 수wc -l /var/log/syslog
1847 /var/log/syslog

tee — 분기 저장

파이프라인 중간에서 결과를 파일에 저장하면서 동시에 다음 명령어로 전달하고 싶을 때 tee를 사용합니다.

# 화면에 출력하면서 파일에도 저장ls -la | tee file_list.txt | wc -l
12

file_list.txt에는 ls -la의 전체 결과가 저장되고, wc -l은 그 줄 수를 화면에 출력합니다.

# 파일에 추가 (-a)find . -name "*.sh" | tee -a scripts.log | head -5
./scripts/backup.sh
./scripts/deploy.sh
./scripts/monitor.sh
./scripts/cleanup.sh
./scripts/report.sh

tee는 스크립트 디버깅에 특히 유용합니다. 중간 결과를 확인하면서 파이프라인을 계속 이어갈 수 있습니다.

xargs — 출력을 인자로 변환

파이프로 전달된 데이터를 다음 명령어의 인자로 사용하고 싶을 때 xargs를 씁니다.

# find로 찾은 파일들을 rm에게 인자로 전달find /tmp -name "*.tmp" | xargs rm -f# 여러 파일 동시에 grep으로 검색find . -name "*.sh" | xargs grep "#!/bin/bash"
./scripts/backup.sh:#!/bin/bash
./scripts/deploy.sh:#!/bin/bash
./monitor.sh:#!/bin/bash
# 파일 이름에 공백이 있을 때는 -print0 + -0 조합find . -name "*.txt" -print0 | xargs -0 wc -l

파이프(|)만으로는 파일 이름을 다른 명령어의 인자로 넘길 수 없습니다. 파이프는 stdin으로 연결하지만, rm이나 cp 같은 명령어는 stdin이 아닌 인자를 받기 때문입니다. 이 간극을 xargs가 채워줍니다.

파이프라인의 개념을 이해했다면, 다음 절에서는 파일 내용을 들여다보는 명령어들을 살펴봅니다.