Linux / 명령어 / wc - 줄·단어·문자 수 계산

wc는 파일이나 표준 입력의 줄 수, 단어 수, 바이트 수, 문자 수를 계산하는 명령어입니다. 옵션 없이 실행하면 개행 수, 단어 수, 바이트 수를 차례로 출력하며, -l, -w, -c, -m으로 필요한 값만 선택할 수 있습니다.

간단한 통계뿐 아니라 로그 건수 확인, 검색 결과 집계, 데이터 파일 검증, 셸 스크립트의 조건 판단에도 자주 사용됩니다. 다만 wc -l은 화면에 보이는 행이 아니라 개행 문자 수를 센다는 점과 -c와 -m의 차이를 알고 사용해야 합니다.

wc 명령어란?

wc는 word count의 약자로, 입력 전체를 읽어 개행(newline), 단어, 바이트, 문자를 계산합니다. 파일을 지정하지 않거나 파일 이름 자리에 -를 사용하면 표준 입력을 읽으므로 다른 명령과 파이프로 연결하기 좋습니다.

GNU wc에서 단어는 공백 문자로 구분되는 비어 있지 않은 문자들의 연속입니다. 문법적인 단어나 사전에 등재된 단어를 판별하는 것이 아니므로 문장 부호가 붙은 문자열도 하나의 단어로 계산될 수 있습니다.

기본 문법과 출력 읽는 방법

기본 문법은 다음과 같습니다. 대괄호는 선택 항목을 뜻하므로 실제 명령에는 입력하지 않습니다.

wc [옵션] [파일...]

옵션 없이 파일 하나를 지정하면 줄 수, 단어 수, 바이트 수와 파일 이름이 출력됩니다.

wc notes.txt
12  48  317 notes.txt

위 결과는 notes.txt에 개행 문자 12개, 단어 48개, 바이트 317개가 있다는 뜻입니다. 출력 필드의 간격은 입력에 따라 달라질 수 있으므로 공백 개수에 의존해 결과를 해석하면 안 됩니다.

필요한 값 하나만 보려면 해당 옵션을 지정합니다.

wc -l notes.txt
wc -w notes.txt
wc -c notes.txt

wc 주요 옵션

옵션 계산 대상 주의할 점
-l, --lines 개행 문자 수 마지막 행에 개행이 없으면 그 행은 포함되지 않음
-w, --words 공백으로 구분된 단어 수 공백의 판단은 로케일의 영향을 받을 수 있음
-c, --bytes 바이트 수 다중 바이트 문자는 한 글자가 여러 바이트일 수 있음
-m, --chars 문자 수 현재 로케일과 문자 인코딩의 영향을 받음
-L, --max-line-length 가장 긴 행의 화면 표시 폭 단순한 문자 수가 아니며 탭과 넓은 문자도 고려함
--files0-from=파일 NUL 문자로 구분된 파일 목록 GNU 확장 옵션이며 특수 문자가 있는 파일명 처리에 유용

여러 옵션을 함께 지정할 수도 있습니다. 출력 순서는 옵션을 적은 순서가 아니라 개행 수, 단어 수, 문자 수, 바이트 수, 최대 행 길이 순으로 정해집니다. 정확한 정의와 GNU 확장 옵션은 GNU Coreutils의 wc 공식 문서에서 확인할 수 있습니다.

줄 수를 정확하게 세는 방법

wc -l은 개행 문자를 센다

wc -l은 논리적인 행의 개수가 아니라 입력에 있는 개행 문자 수를 출력합니다. 일반적인 텍스트 파일은 각 행이 개행으로 끝나므로 결과가 행 수와 같지만, 마지막 행에 개행이 없으면 눈에 보이는 행보다 하나 적게 나올 수 있습니다.

wc -l access.log

텍스트 파일이 개행으로 끝나는지는 다음처럼 마지막 바이트를 확인해 판단할 수 있습니다. 결과가 0a이면 LF 개행으로 끝난 것입니다.

tail -c 1 notes.txt | od -An -t x1

파일 이름 없이 숫자만 출력하기

파일을 인수로 전달하면 결과 뒤에 파일 이름이 표시됩니다. 셸 변수에 숫자만 저장하고 싶다면 표준 입력 리디렉션을 사용합니다.

line_count=$(wc -l < notes.txt)
printf '%s\n' "$line_count"

GNU wc는 하나의 값만 출력할 때 앞쪽 공백 없이 표시하지만, 다른 구현까지 고려하는 스크립트라면 숫자 형식을 별도로 검증하는 것이 안전합니다.

바이트 수와 문자 수의 차이

-c는 저장 공간의 바이트를 센다

wc -c는 입력의 바이트 수를 셉니다. 파일 크기를 바이트 단위로 확인하거나 전송할 데이터의 실제 크기를 계산할 때 적합합니다.

wc -c document.txt

파일 시스템이 보고하는 크기만 필요하면 stat이 파일 전체를 읽지 않고 메타데이터에서 값을 얻을 수 있어 더 적합할 수 있습니다.

stat -c '%s' document.txt

-m은 로케일에 따른 문자를 센다

wc -m은 현재 로케일과 인코딩을 기준으로 문자 수를 계산합니다. UTF-8에서 영문자 하나는 보통 1바이트지만 한글 한 글자는 보통 3바이트이므로 같은 파일에서 -c와 -m의 결과가 다를 수 있습니다.

printf 'Linux 한글\n' | wc -c
printf 'Linux 한글\n' | wc -m

잘못된 인코딩이 섞인 파일에서는 문자 수가 기대와 다를 수 있습니다. 문자 기반 처리가 목적이라면 locale로 현재 환경을 확인하고 파일 인코딩과 일치시키세요.

단어 수는 어떻게 계산되나요?

wc -w는 공백으로 구분되는 비어 있지 않은 문자열의 개수를 셉니다. 연속된 공백이나 탭은 구분자 역할을 하며, 문장 부호를 제거하거나 언어의 형태소를 분석하지는 않습니다.

printf 'one  two\tthree\n' | wc -w
3

공백으로 단어가 명확히 구분되지 않는 언어의 자연어 분석이나 정확한 토큰 수 계산에는 wc -w가 적합하지 않을 수 있습니다. 이 경우 목적에 맞는 형태소 분석기나 파서를 사용해야 합니다.

여러 파일의 개수와 합계 확인하기

파일별 결과와 total 행

파일을 여러 개 지정하면 각 파일의 결과 뒤에 전체 합계인 total 행이 추가됩니다.

wc -l january.log february.log march.log
  120 january.log
  135 february.log
   98 march.log
  353 total

GNU --total 옵션으로 합계 방식 지정하기

최신 GNU wc는 --total=auto, always, only, never로 합계 행의 출력 방식을 제어할 수 있습니다. 합계 숫자만 필요하면 다음과 같이 사용할 수 있습니다.

wc -l --total=only january.log february.log march.log

--total은 GNU 확장 기능이며 오래된 Coreutils나 다른 유닉스 계열 환경에는 없을 수 있습니다. 이식성이 필요하면 wc --help로 지원 여부를 확인하고 기존 출력의 마지막 행을 처리하는 방법을 사용하세요.

파이프와 함께 사용하는 실전 예제

검색 결과 행 수 세기

grep 결과를 wc -l로 넘기면 일치한 행의 수를 셀 수 있습니다.

grep 'ERROR' app.log | wc -l

파일 하나에서 일치한 행 수만 필요하다면 grep -c 'ERROR' app.log가 더 직접적입니다. 두 방식 모두 한 행에 패턴이 여러 번 있어도 그 행을 한 번만 셉니다. 자세한 검색 방법은 Linux grep 명령어 사용법을 참고하세요.

CSV 데이터 행 수 확인하기

첫 번째 행이 열 이름인 CSV 파일이라면 tail -n +2로 헤더를 건너뛴 뒤 데이터 행을 셀 수 있습니다.

tail -n +2 data.csv | wc -l

CSV 필드 안에 실제 개행이 허용된 파일은 한 레코드가 여러 물리적 행을 차지할 수 있으므로 이 방식으로 레코드 수를 정확히 셀 수 없습니다. 그런 파일은 CSV 파서를 사용해야 합니다. tail의 범위 지정 방법은 Linux tail 명령어 사용법에서 확인할 수 있습니다.

특수 문자가 있는 파일 이름까지 안전하게 세기

find의 일반 출력은 파일명에 개행 문자가 있을 때 항목 수를 잘못 셀 수 있습니다. GNU 환경에서는 파일명을 NUL 문자로 구분한 뒤 NUL 개수를 세는 방법을 사용할 수 있습니다.

find ./logs -type f -name '*.log' -print0 | tr -cd '\0' | wc -c

단순히 find ... | wc -l을 사용하는 것보다 공백과 개행이 포함된 파일 이름에 안전합니다. 검색 패턴인 *.log는 셸이 먼저 확장하지 않도록 따옴표로 감싸야 합니다.

실행 중인 프로세스 수 확인하기

GNU/Linux의 ps가 --no-headers를 지원한다면 헤더를 제외한 프로세스 목록의 행을 셀 수 있습니다.

ps -e --no-headers | wc -l

명령을 실행하는 순간의 스냅샷이며, 파이프라인 자체의 프로세스가 포함되는지 여부나 ps 구현에 따라 결과가 달라질 수 있습니다. 모니터링 지표로 사용할 때는 전용 도구나 /proc 기반 수집 방식을 검토하세요.

가장 긴 행의 길이 확인하기

wc -L은 가장 긴 행의 단순 바이트 수나 문자 수가 아니라 화면에 표시되는 최대 폭을 계산합니다. GNU wc는 현재 로케일을 기준으로 넓은 문자를 고려하고 탭 정지 위치를 8칸 단위로 계산합니다.

wc -L table.txt

따라서 -L 결과가 awk '{ print length }'로 구한 문자 길이나 wc -c의 바이트 수와 같다고 가정하면 안 됩니다. 코드 스타일 검사처럼 정확한 문자 개수가 필요한 작업은 사용하는 도구의 길이 정의를 먼저 확인해야 합니다.

많은 파일을 안전하게 처리하기

명령행 길이 제한 피하기

파일이 매우 많으면 셸이 와일드카드를 확장한 결과가 명령행 길이 제한을 넘을 수 있습니다. GNU wc의 --files0-from=-은 NUL로 구분된 파일 목록을 표준 입력에서 읽어 이 문제를 피합니다.

find ./logs -type f -name '*.log' -print0 | wc -l --files0-from=-

이 명령은 각 로그 파일의 행 수와 전체 합계를 출력합니다. 파일 이름에 공백이나 개행이 있어도 NUL 구분자를 사용하므로 안전하게 전달됩니다.

xargs로 나눈 합계에 주의하기

find ... | xargs wc -l은 파일 수가 많을 때 여러 번의 wc 실행으로 나뉠 수 있습니다. 이 경우 각 실행마다 별도의 total이 생겨 전체 합계를 곧바로 읽기 어렵습니다. GNU 환경에서는 --files0-from=-이 전체 목록을 한 번에 집계하는 목적에 더 잘 맞습니다.

셸 스크립트에서 사용할 때의 원칙

필요한 값 하나만 요청하기

옵션 없는 wc 출력의 여러 열을 공백 위치로 잘라 쓰지 말고 -l, -w, -c처럼 필요한 값만 요청합니다. 파일 이름도 필요 없다면 입력 리디렉션을 사용합니다.

bytes=$(wc -c < archive.dat)

오류와 0을 구분하기

빈 파일의 결과 0과 파일을 읽지 못한 오류는 의미가 다릅니다. 값만 저장하면 표준 오류나 종료 상태를 놓칠 수 있으므로 중요한 자동화에서는 명령 성공 여부를 함께 확인합니다.

if count=$(wc -l < input.txt); then
  printf 'lines=%s\n' "$count"
else
  printf 'input.txt를 읽지 못했습니다.\n' >&2
fi

자주 발생하는 오해와 주의점

wc -l 결과가 예상보다 하나 적습니다

마지막 행이 개행 문자로 끝나지 않았을 가능성이 큽니다. wc -l은 개행 문자를 세기 때문에 마지막의 불완전한 행을 포함하지 않습니다. 원본 형식을 임의로 변경하기 전에 파일을 생성한 프로그램의 출력 규칙부터 확인하세요.

한글이 들어가면 -c와 -m이 다릅니다

-c는 바이트, -m은 문자를 셉니다. UTF-8 같은 다중 바이트 인코딩에서는 정상적인 차이입니다. 저장 크기가 목적이면 -c, 사람이 인식하는 문자 개수가 목적이면 인코딩과 로케일을 확인한 뒤 -m을 사용합니다.

ls 출력으로 파일 수를 세어도 되나요?

일반적인 파일명에서는 ls | wc -l이 간단해 보이지만, 별칭·출력 형식·개행이 포함된 파일명 때문에 자동화에 적합하지 않습니다. 파일 종류와 검색 깊이를 명시할 수 있는 find를 사용하고, 임의의 파일명을 다룬다면 NUL 구분 방식을 선택하세요.

자주 묻는 질문

wc를 옵션 없이 실행하면 무엇이 나오나요?

기본적으로 개행 수, 단어 수, 바이트 수가 이 순서로 출력됩니다. 파일을 인수로 지정했다면 마지막에 파일 이름도 표시됩니다.

빈 파일에서 wc 결과는 어떻게 나오나요?

내용이 전혀 없는 빈 파일은 줄, 단어, 바이트 수가 모두 0입니다. 개행 문자 하나만 있는 파일은 wc -l 결과가 1이고 바이트 수는 사용하는 개행 형식에 따라 달라질 수 있습니다.

wc -w는 한글 단어 수도 정확히 세나요?

wc -w는 언어를 분석하지 않고 공백으로 구분된 문자열을 셉니다. 띄어쓰기가 입력 목적에 맞게 되어 있다면 참고값으로 쓸 수 있지만, 한국어 형태소나 의미 단위의 정확한 단어 수는 보장하지 않습니다.

디렉터리 자체의 줄 수를 셀 수 있나요?

wc는 디렉터리 항목을 직접 세는 명령이 아닙니다. find 등으로 원하는 파일 목록을 만들고 그 결과를 집계해야 합니다. 파일명에 특수 문자가 있을 수 있다면 줄바꿈 대신 NUL 문자를 구분자로 사용하세요.

정리

줄 수는 wc -l, 단어 수는 wc -w, 바이트 수는 wc -c, 문자 수는 wc -m으로 확인합니다. 옵션 없는 출력은 개행·단어·바이트 순이며, 여러 파일을 지정하면 파일별 값과 전체 합계가 표시됩니다.

정확한 결과를 위해서는 wc -l이 개행 문자를 센다는 점, 바이트와 문자가 다를 수 있다는 점, 파일명 목록에는 NUL 구분이 필요할 수 있다는 점을 기억하세요. 다른 기본 도구도 함께 살펴보려면 리눅스에서 자주 사용하는 명령어 목록을 참고할 수 있습니다.

같은 카테고리의 다른 글
Linux / 명령어 / ls - 파일과 디렉터리 목록 확인

Linux / 명령어 / ls - 파일과 디렉터리 목록 확인

Linux ls 명령어로 파일과 디렉터리 목록, 숨김 파일, 권한과 소유자, 크기 및 수정 시간을 확인하는 방법을 설명합니다. 자주 쓰는 옵션 조합과 정렬 방법, 스크립트에서 ls 출력을 안전하게 다루는 기준도 정리합니다.

Linux / 명령어 / ssh-keygen - SSH 키 쌍 생성과 지문 확인

Linux / 명령어 / ssh-keygen - SSH 키 쌍 생성과 지문 확인

Linux ssh-keygen 명령어의 기능과 기본 문법을 설명합니다. 실제 사용 예제, 주요 옵션과 작업 전 확인할 점을 알아봅니다.

Linux / 명령어 / nice - 새 명령의 CPU 우선순위 조정

Linux / 명령어 / nice - 새 명령의 CPU 우선순위 조정

Linux nice 명령어의 기본 문법과 실제 사용 예제를 설명합니다. 주요 옵션과 결과를 해석할 때 주의할 점을 확인할 수 있습니다.

Linux / 명령어 / cd - 디렉터리 이동

Linux / 명령어 / cd - 디렉터리 이동

Linux cd 명령어로 절대·상대 경로, 홈과 이전 디렉터리로 이동하는 방법을 설명합니다. 심볼릭 링크 처리, CDPATH, 스크립트와 sudo cd의 한계 및 오류 해결법도 정리합니다.

Linux / 명령어 / tail - 파일의 마지막 내용과 로그 실시간 확인

Linux / 명령어 / tail - 파일의 마지막 내용과 로그 실시간 확인

Linux tail 명령어로 파일의 마지막 행과 바이트를 확인하고 새로 추가되는 로그를 추적하는 방법을 설명합니다. -n, -f, -F 차이와 로그 로테이션, 필터링 및 여러 파일 모니터링 예제를 정리합니다.

Linux / 명령어 / install - 파일 복사와 권한 설정

Linux / 명령어 / install - 파일 복사와 권한 설정

Linux install 명령어로 파일을 복사하면서 권한, 소유자와 대상 디렉터리를 설정하는 방법을 설명합니다. cp와의 차이와 배포 스크립트에서의 활용법도 알아봅니다.

Linux / 명령어 / less - 긴 파일을 검색하며 페이지 단위로 보기

Linux / 명령어 / less - 긴 파일을 검색하며 페이지 단위로 보기

Linux less 명령어로 긴 텍스트와 명령 출력을 페이지 단위로 탐색하는 방법을 설명합니다. 검색, 이동, 실시간 갱신과 파이프 사용법을 정리합니다.

Linux / 명령어 / ping - 호스트 응답과 왕복 시간 확인

Linux / 명령어 / ping - 호스트 응답과 왕복 시간 확인

Linux ping 명령어의 기능과 기본 문법을 설명합니다. 실제 사용 예제, 주요 옵션과 작업 전 확인할 점을 알아봅니다.

Linux / 명령어 / apk - Alpine Linux 패키지 설치·제거와 저장소 갱신

Linux / 명령어 / apk - Alpine Linux 패키지 설치·제거와 저장소 갱신

Linux apk 명령어의 적용 배포판과 기본 작업을 설명합니다. 패키지 조회·설치 예제, 주요 옵션과 시스템 변경 시 주의점을 알아봅니다.

Linux / 명령어 / find - 조건으로 파일과 디렉터리 검색

Linux / 명령어 / find - 조건으로 파일과 디렉터리 검색

Linux find 명령어로 경로, 이름, 종류, 크기, 시간과 권한 조건을 조합해 파일을 찾는 방법을 설명합니다. 안전한 exec 사용과 삭제 전 검증도 다룹니다.