iBetter Books
수정

tr과 wc

텍스트에서 특정 문자를 다른 문자로 바꾸거나 지워야 할 때 tr을 씁니다. 파일이 몇 줄인지, 단어가 몇 개인지 세야 할 때는 wc를 씁니다. 두 명령어 모두 간단하지만 실무에서 생각보다 자주 씁니다.

tr — 문자 변환과 삭제

tr은 "translate"의 약자입니다. 파일을 직접 읽지 않고, 표준 입력에서만 받습니다. 반드시 파이프나 리다이렉션과 함께 써야 합니다.

echo "문자열" | tr '원본문자' '대체문자'tr '원본문자' '대체문자' < 파일명

기본 문자 변환

# 소문자를 대문자로 변환echo "hello world" | tr 'a-z' 'A-Z'
HELLO WORLD
# 대문자를 소문자로 변환echo "HELLO WORLD" | tr 'A-Z' 'a-z'
hello world
# 쉼표를 탭으로 변환 (CSV를 TSV로)echo "김철수,85,A" | tr ',' '\t'
김철수	85	A

tr 문자 클래스

일일이 범위를 쓰는 대신 미리 정의된 문자 클래스를 쓸 수 있습니다.

클래스 의미
[:upper:] 대문자 A-Z
[:lower:] 소문자 a-z
[:digit:] 숫자 0-9
[:alpha:] 알파벳 (대소문자)
[:alnum:] 알파벳 + 숫자
[:space:] 공백 문자 (스페이스, 탭, 줄바꿈 등)
[:punct:] 구두점 문자
# 문자 클래스로 대소문자 변환echo "Hello World" | tr '[:upper:]' '[:lower:]'
hello world
# 숫자만 X로 마스킹echo "주민번호: 900101-1234567" | tr '[:digit:]' 'X'
주민번호: XXXXXX-XXXXXXX

tr 주요 옵션

옵션 설명
-d 지정한 문자를 삭제
-s 연속된 같은 문자를 하나로 압축
-c 지정 문자 외의 모든 문자에 적용
# 숫자 외의 모든 문자 삭제 (숫자만 남기기)echo "전화: 010-1234-5678" | tr -d -c '0-9\n'
01012345678
# 여러 개의 연속 공백을 하나로 압축echo "너무   많은    공백" | tr -s ' '
너무 많은 공백
# 줄바꿈 문자 삭제 (여러 줄을 한 줄로)cat /tmp/names.txt | tr -d '\n'
김철수이영희박민준
# 특수문자 제거 (알파벳, 숫자, 공백만 남기기)echo "Hello, World! (2026)" | tr -d '[:punct:]'
Hello World 2026

wc — 줄, 단어, 바이트 세기

wc는 "word count"의 약자이지만, 줄 수와 바이트 수도 셉니다.

wc [옵션] 파일명명령어 | wc [옵션]
옵션 설명
-l 줄 수
-w 단어 수
-c 바이트 수
-m 문자 수 (멀티바이트 지원)
# 옵션 없이 사용하면 줄/단어/바이트 모두 출력wc /tmp/access.log
 10  90 950 /tmp/access.log

줄 10개, 단어 90개, 바이트 950개입니다.

# 줄 수만wc -l /tmp/access.log
10 /tmp/access.log
# 파일명 없이 숫자만 필요할 때 (파이프 활용)wc -l < /tmp/access.log
10

파이프 또는 리다이렉션으로 입력을 전달하면 파일명이 출력되지 않습니다.

실습: 파이프라인 조합

# 실습 1: 오류 로그(4xx, 5xx)가 몇 줄인지 세기grep -E " [45][0-9]{2} " /tmp/access.log | wc -l
5
# 실습 2: 소스 코드 라인 수 세기 (빈 줄 제외)grep -v "^$" /tmp/access.log | wc -l
10
# 실습 3: 파일에서 특수문자 제거 후 단어 수 세기cat /tmp/access.log | tr -d '[]"' | wc -w
# 실습 4: CSV 파일을 대문자로 변환cat /tmp/products.csv | tr '[:lower:]' '[:upper:]'
상품명,카테고리,가격
노트북,전자기기,1200000
마우스,전자기기,35000
키보드,전자기기,89000
책상,가구,450000
의자,가구,320000
모니터,전자기기,680000

한글은 tr의 문자 클래스에 영향을 받지 않으므로 그대로 출력됩니다.

# 실습 5: 디렉토리 내 파일 수 세기ls /etc/*.conf 2>/dev/null | wc -l
# 실습 6: 로그에서 IP 주소 숫자만 남기기 (IP 검증 전처리)echo "접속 IP: 192.168.1.100" | tr -d -c '0-9.\n'
192.168.1.100

이번 장에서 배운 여섯 가지 도구(grep, sort, uniq, cut, paste, tr, wc)는 모두 단독으로도 유용하지만, 파이프로 연결할 때 진짜 힘을 발휘합니다. 다음 장에서는 이 도구들과 함께 쓸 정규표현식을 배웁니다. 정규표현식을 알면 grep이 훨씬 강력해집니다.