리눅스 nl 명령어 사용법 - 줄 번호 매기기와 cat -n 과의 차이
이 명령어를 언제 쓰는가
텍스트에 줄 번호를 붙일 때 쓴다. 설정 파일의 문제 줄을 "몇 번째 줄"로 지목해서 동료에게 알려 주거나, 로그 조각을 잘라 내 티켓에 붙일 때처럼 위치를 명시해야 하는 상황이다.
대부분은 cat -n 이나 grep -n 으로 충분하다. nl 을 꺼내는 이유는 셋 중 하나다 — 빈 줄에 번호를 매길지 말지 고르고 싶을 때, 번호 자릿수·앞채움·구분자를 지정하고 싶을 때, 특정 패턴이 나올 때마다 번호를 다시 시작하고 싶을 때다. 그 외에는 cat -n 이 짧다.
기본 형식
nl [옵션] [파일]
파일을 생략하면 표준 입력을 읽는다. 아무 옵션 없이 실행하면 내용이 있는 줄에만 번호가 붙고 빈 줄은 건너뛴다. 이것이 cat -n 과의 가장 큰 차이다.
$ printf 'alpha\n\nbeta\n' | nl
1 alpha
2 beta
파일의 실제 줄 번호와 맞춰야 한다면 반드시 -ba 를 붙여야 한다.
자주 쓰는 옵션
| 옵션 | 의미 | 예시 |
|---|---|---|
-b a | 모든 줄에 번호를 붙인다. 빈 줄 포함 | nl -ba conf |
-b t | 내용이 있는 줄만 번호를 붙인다(기본값) | nl -bt conf |
-b p정규식 | 정규식에 맞는 줄에만 번호를 붙인다 | nl -bp'^ERROR' app.log |
-n ln|rn|rz | 번호 정렬. 왼쪽/오른쪽/오른쪽+0채움 | nl -ba -nrz app.log |
-w N | 번호 칸 너비. 기본 6 | nl -ba -w3 conf |
-s STR | 번호와 본문 사이 구분자. 기본은 탭 | nl -ba -s': ' conf |
-v N | 시작 번호 | nl -ba -v100 conf |
-i N | 번호 증가폭 | nl -ba -i10 conf |
실전 예제
1) 설정 파일의 진짜 줄 번호를 본다. 에러 로그가 "line 42" 라고 알려 줬을 때 그 줄을 찾는 상황이다. 빈 줄도 세야 하므로 -ba 가 필수다.
nl -ba /etc/nginx/nginx.conf | sed -n '38,46p'
2) 번호를 0으로 채워 폭을 고정한다. 결과를 그대로 정렬하거나 파일명으로 쓸 때 자릿수가 흔들리지 않는다.
$ printf 'alpha\nbeta\n' | nl -ba -nrz -w4
0001 alpha
0002 beta
3) 구분자를 바꿔 CSV 로 만든다. 목록에 순번을 붙여 스프레드시트로 넘길 때 쓴다.
sort -u hosts.txt | nl -ba -nln -w1 -s',' > hosts-numbered.csv
1,web01
2,web02
3,db01
4) 특정 패턴이 나온 줄에만 번호를 붙인다. 로그에서 ERROR 만 몇 번째 에러인지 세고 싶을 때 쓴다. cat -n 으로는 못 하는 일이다.
nl -bp'ERROR' app.log | grep 'ERROR' | tail -n 20
5) 시작 번호를 조정해 잘라 낸 조각의 원래 위치를 유지한다. 파일 중간을 잘라 공유할 때 번호가 1부터 다시 시작하면 위치가 어긋난다.
sed -n '500,520p' app.log | nl -ba -v500
6) 번호를 다시 떼어 낸다. 번호를 붙여 검토한 결과를 원본 형태로 되돌릴 때 쓴다.
nl -ba a.txt | cut -f2-
nl 의 기본 구분자가 탭이고 cut 의 기본 구분자도 탭이라 이 조합이 깔끔하게 맞아떨어진다.
함정과 주의점
기본값이 -bt 라 빈 줄이 번호에서 빠진다. nl 로 얻은 번호를 vi 의 :42 나 에러 로그의 줄 번호와 대조하면 안 맞는다. 파일에 빈 줄이 하나만 있어도 그 아래는 전부 어긋난다. 실제 줄 번호가 필요하면 무조건 -ba 다. 헷갈리기 싫으면 cat -n 이나 grep -n 을 쓰는 편이 낫다.
번호와 본문 사이는 탭이다. 눈으로는 공백처럼 보이지만 실제 문자는 탭이라, cut -d' ' 나 공백 기준 파싱을 걸면 안 먹는다. 반대로 cut -f2- 는 잘 된다. 파이프로 넘길 계획이면 -s 로 구분자를 명시하는 편이 안전하다.
기본 번호 칸 너비가 6이라 앞에 공백이 붙는다. 그대로 다른 도구에 넘기면 값 앞의 공백 때문에 숫자 비교가 실패한다. -w1 또는 -nln(왼쪽 정렬)으로 없앤다.
nl 은 한 파일씩 처리하는 것이 안전하다. 여러 파일을 넘기면 구현에 따라 번호를 이어 붙이기도 하고 페이지 구분자(\:\:\:)를 해석하기도 한다. 파일별 번호가 필요하면 반복문으로 하나씩 돌린다.
함께 보면 좋은 명령어
cat—cat -n은 빈 줄까지 무조건 번호를 매긴다. 단순 확인용으로는 이쪽이 낫다.grep—grep -n은 찾은 줄의 실제 번호를 알려 준다. 위치 확인의 첫 수단이다.sed—sed -n '10,20p'로 원하는 범위를 먼저 잘라 낸 뒤 nl 에 넘기는 조합이 자주 쓰인다.