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이 훨씬 강력해집니다.