리눅스 wc 명령어 사용법 - 줄 수·단어 수·바이트 수 세기 실전 예제
이 명령어를 언제 쓰는가
"에러가 몇 건이지", "이번 배치에서 몇 개나 처리됐지", "파일이 몇 개 걸렸지" 같은 질문에 답하는 명령이다. 파이프라인 끝에 | wc -l 을 붙여 결과 개수를 세는 것이 실무에서 압도적으로 많이 쓰는 형태다.
파일을 눈으로 보기 전에 규모부터 확인하는 용도로도 쓴다. 로그가 100줄인지 1억 줄인지 알아야 cat 을 쳐도 되는지 판단할 수 있다.
기본 형식
wc [옵션] 파일...
옵션 없이 쓰면 줄 수, 단어 수, 바이트 수를 순서대로 출력하고 파일명을 붙인다.
$ wc access.log
120453 1806795 24310922 access.log
파일을 여러 개 주면 각 파일의 결과와 함께 마지막에 total 행이 붙는다. 파일명을 생략하면 표준 입력을 읽는다.
자주 쓰는 옵션
| 옵션 | 의미 | 예시 |
|---|---|---|
-l | 줄 수만 센다. 실무에서 90%는 이것이다 | wc -l app.log |
-w | 단어 수를 센다 (공백으로 구분) | wc -w README.md |
-c | 바이트 수를 센다 | wc -c dump.sql |
-m | 문자 수를 센다. 한글은 -c 와 값이 다르다 | wc -m korean.txt |
-L | 가장 긴 줄의 길이를 알려준다 | wc -L access.log |
실전 예제
1) 로그 파일의 전체 건수를 확인한다. 파일을 열기 전에 규모부터 본다.
wc -l /var/log/nginx/access.log
2) 오늘 발생한 에러 건수를 센다. grep 결과를 파이프로 넘기는 가장 흔한 조합이다.
grep '2026-08-25' /var/log/app/error.log | wc -l
다만 grep 만으로 셀 수 있으면 grep -c 가 더 빠르다. 파이프가 여러 단계일 때 wc 를 쓴다.
3) find 로 걸린 파일 개수를 센다. 삭제 전에 "몇 개나 지워지는지" 확인하는 안전 절차다.
find /backup -type f -name '*.sql.gz' -mtime +30 | wc -l
4) 중복 제거 전후를 비교한다. 데이터에 중복이 얼마나 섞였는지 한눈에 본다.
wc -l emails.txt
sort -u emails.txt | wc -l
5) 가장 긴 줄의 길이를 확인한다. DB 컬럼 길이를 정하거나 로그 한 줄이 비정상적으로 긴지 볼 때 쓴다.
wc -L /var/log/app/app.log
6) 한글 텍스트의 실제 글자 수를 센다. 바이트 수와 헷갈리면 안 되는 상황에서 쓴다.
wc -c -m notice.txt
UTF-8에서 한글 한 글자는 3바이트라 -c 값이 -m 의 약 세 배로 나온다. DB varchar 길이를 계산할 때 이 차이가 문제가 된다.
함정과 주의점
마지막 줄에 개행이 없으면 -l 값이 하나 적게 나온다. wc -l 은 "줄"이 아니라 개행 문자의 개수를 센다. 아래를 직접 확인해 보면 명확하다.
$ printf 'a\nb\nc' | wc -l
2
줄은 셋인데 결과는 2다. 애플리케이션이 만든 파일이나 API 응답을 저장한 파일에서 자주 발생한다. 건수가 하나씩 어긋나는 배치 대사 오류의 흔한 원인이므로, 정확한 레코드 수가 필요하면 grep -c '' 를 쓰거나 데이터 생성 쪽에서 개행을 보장한다.
ls | wc -l 로 파일 개수를 세면 틀린다. 두 가지 이유다. 첫째, ls 는 숨김 파일을 빼고 센다. 둘째, 파일명에 개행이 들어 있으면 한 파일이 두 줄로 계산된다. 정확히 세려면 이렇게 한다.
find . -maxdepth 1 -type f | wc -l
숨김 파일까지 포함하려면 ls -A | wc -l, 파일명에 개행이 있을 수 있는 환경이라면 find . -maxdepth 1 -type f -printf '.' | wc -c 처럼 센다. 다만 -printf 는 GNU find 전용이라 macOS 에서는 unknown primary 오류가 난다. 어디서나 도는 형태는 find . -maxdepth 1 -type f -print0 | tr -dc '\0' | wc -c 다.
파일명을 인자로 주면 결과에 파일명이 붙는다. 스크립트에서 숫자만 필요한데 COUNT=$(wc -l app.log) 로 받으면 120453 app.log 가 통째로 들어가 산술 비교가 깨진다. 파이프로 넘기면 파일명이 붙지 않는다.
COUNT=$(wc -l < app.log)
BSD/macOS 의 wc 는 여기에 더해 숫자 앞에 공백 패딩까지 붙인다. 리다이렉션으로 받은 뒤에도 값이 이상하면 tr -d ' ' 로 다듬는다.
함께 보면 좋은 명령어
- grep -c — 조건에 맞는 줄만 셀 거라면 파이프 없이 이쪽이 빠르다.
- uniq -c — 전체 건수가 아니라 값별 건수가 필요할 때 쓴다.
- du — 줄 수가 아니라 디스크 용량이 궁금하면 wc -c 가 아니라 du 를 쓴다.