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 / 명령어 / groups - 사용자의 그룹 소속 확인

Linux / 명령어 / groups - 사용자의 그룹 소속 확인

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

Linux / 명령어 / tr - 표준 입력의 문자 치환과 삭제

Linux / 명령어 / tr - 표준 입력의 문자 치환과 삭제

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

Linux / 명령어 / mkdir - 디렉터리 생성

Linux / 명령어 / mkdir - 디렉터리 생성

Linux mkdir 명령어로 디렉터리와 여러 단계의 상위 디렉터리를 만드는 방법을 설명합니다. 권한, umask, SELinux 환경과 자동화에서 안전하게 사용하는 방법도 정리합니다.

Linux / 명령어 / bg - 중지된 셸 작업을 백그라운드에서 재개

Linux / 명령어 / bg - 중지된 셸 작업을 백그라운드에서 재개

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

Linux 강좌 / 파일 권한 읽고 바꾸기와 sudo 사용법

Linux 강좌 / 파일 권한 읽고 바꾸기와 sudo 사용법

리눅스 파일과 디렉터리의 읽기·쓰기·실행 권한을 해석하고 chmod로 실습 파일의 권한을 바꿉니다. sudo의 사용 범위와 권한 오류를 진단하는 순서도 설명합니다.

Linux / 명령어 / sync - 버퍼에 남은 쓰기 데이터 저장 요청

Linux / 명령어 / sync - 버퍼에 남은 쓰기 데이터 저장 요청

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

Linux / 명령어 / tee - 파이프 출력을 화면과 파일에 동시 저장

Linux / 명령어 / tee - 파이프 출력을 화면과 파일에 동시 저장

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

Linux / 명령어 / pwd - 현재 작업 디렉터리 경로 확인

Linux / 명령어 / pwd - 현재 작업 디렉터리 경로 확인

Linux pwd 명령어로 현재 작업 디렉터리를 확인하는 방법을 설명합니다. 논리적 경로와 물리적 경로, 셸 내장 명령과 PWD 변수의 차이도 함께 알아봅니다.

Linux / 명령어 / unxz - xz 압축 파일 풀기

Linux / 명령어 / unxz - xz 압축 파일 풀기

Linux unxz 명령어의 용도와 기본 문법을 알아봅니다. 파일 처리 예제, 주요 옵션과 원본 보존·덮어쓰기 주의점을 설명합니다.

Linux / 명령어 / lsblk - 디스크·파티션 구조와 마운트 지점 확인

Linux / 명령어 / lsblk - 디스크·파티션 구조와 마운트 지점 확인

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