지식
Linux
wc · nl — 줄/단어/문자 세기와 행 번호
wc로 파일의 줄·단어·바이트 수를 세고, nl과 cat -n으로 행 번호를 붙이는 방법을 실전 활용 예제와 함께 설명합니다.
지난 글에서 tr, fold, fmt로 문자를 변환하고 줄을 재배치하는 방법을 살펴봤습니다. 이번 글에서는 파일의 통계(줄 수, 단어 수, 바이트 수)를 구하는 wc와 출력에 행 번호를 붙이는 nl을 다룹니다. 두 명령어 모두 단순하지만 스크립트와 파이프라인에서 자주 사용됩니다.
wc — 파일 통계 측정
wc(word count)는 파일이나 표준 입력의 줄 수, 단어 수, 바이트 수를 출력합니다.
# 기본 출력: 줄 수 단어 수 바이트 수 파일명
wc /etc/passwd
# → 54 108 2923 /etc/passwd
개별 옵션
# 줄 수만
wc -l /etc/passwd
# 단어 수만
wc -w document.txt
# 바이트 수만
wc -c image.png
# 문자 수 (멀티바이트 인코딩 고려)
wc -m utf8.txt
줄 수(-l)는 개행 문자 \n의 수를 셉니다. 마지막 줄에 개행이 없으면 그 줄은 집계에 포함되지 않으므로 주의하세요.
여러 파일 합산
# 각 파일의 통계와 합계 표시
wc -l *.py
# → 34 main.py
# → 18 utils.py
# → 52 total
파이프라인에서 사용
# grep 결과 줄 수 (grep -c 와 동일)
grep "ERROR" app.log | wc -l
# 현재 디렉터리 파일 수
ls -1 | wc -l
# 프로세스 수
ps aux | wc -l
# 열린 파일 수 (lsof)
lsof | wc -l
파이프 끝에서 wc -l을 쓸 때는 파일명이 출력되지 않으므로 깔끔한 숫자만 얻을 수 있습니다.
스크립트에서 숫자만 추출
# 공백 제거 후 변수에 담기
count=$(wc -l < /etc/passwd)
echo "User count: $count"
wc < file처럼 리다이렉션을 쓰면 파일명이 출력되지 않아 변수 할당에 편리합니다.
nl — 행 번호 붙이기
nl(number lines)은 파일의 각 줄 앞에 번호를 붙여 출력합니다.
# 기본: 비어 있지 않은 줄에 번호
nl script.sh
# cat -n: 빈 줄 포함 모든 줄에 번호
cat -n script.sh
nl과 cat -n의 차이는 기본 동작에 있습니다. nl은 빈 줄을 번호 없이 출력하고, cat -n은 빈 줄에도 번호를 붙입니다.
-b: 번호 붙이는 줄 선택
# 모든 줄에 번호 붙이기 (빈 줄 포함)
nl -ba file.txt
# 빈 줄에만 번호 없음 (기본)
nl -bt file.txt
-v: 시작 번호, -i: 증가량
# 0부터 시작
nl -v 0 file.txt
# 10씩 증가 (10, 20, 30...)
nl -i 10 file.txt
번호 형식 지정
# 오른쪽 정렬, 0 패딩, 6자리
nl -nrz -w 6 -ba file.txt
# → 000001 첫 번째 줄
# 왼쪽 정렬
nl -nln -w 6 file.txt
-n 옵션값: ln(좌측 정렬), rn(우측 정렬), rz(우측 정렬 + 0 패딩).
실전 활용
코드 리뷰용 번호 붙이기
# 함수만 번호 붙여 확인 (grep 라인 번호와 함께)
nl -ba main.py | grep "def "
로그 줄 번호로 위치 파악
# ERROR 발생 줄 번호 확인
nl -ba app.log | grep "ERROR" | head -5
빈 줄 수 세기
# 빈 줄 수 = 전체 줄 수 - 비어있지 않은 줄 수
total=$(wc -l < file.txt)
nonempty=$(grep -c '.' file.txt)
empty=$((total - nonempty))
echo "빈 줄: $empty"
파일 크기 비교
# 두 파일의 바이트 크기를 비교
a=$(wc -c < file1.bin)
b=$(wc -c < file2.bin)
echo "file1: ${a}B, file2: ${b}B"
정리
| 명령어 | 역할 |
|---|---|
wc -l | 줄 수 |
wc -w | 단어 수 |
wc -c | 바이트 수 |
wc -m | 문자 수 (UTF-8 인식) |
nl | 행 번호 (비어있지 않은 줄) |
nl -ba | 행 번호 (모든 줄) |
cat -n | 행 번호 (모든 줄, nl -ba 와 동일) |
지난 글: tr · fold · fmt — 문자 변환과 줄 포맷
다음 글: diff · patch — 파일 비교와 패치 적용
읽어주셔서 감사합니다. 😊