Devin.KR
로그인

리눅스 nl 명령어 사용법 - 줄 번호 매기기와 cat -n 과의 차이

개발자 조회 1

이 명령어를 언제 쓰는가

텍스트에 줄 번호를 붙일 때 쓴다. 설정 파일의 문제 줄을 "몇 번째 줄"로 지목해서 동료에게 알려 주거나, 로그 조각을 잘라 내 티켓에 붙일 때처럼 위치를 명시해야 하는 상황이다.

대부분은 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번호 칸 너비. 기본 6nl -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 은 한 파일씩 처리하는 것이 안전하다. 여러 파일을 넘기면 구현에 따라 번호를 이어 붙이기도 하고 페이지 구분자(\:\:\:)를 해석하기도 한다. 파일별 번호가 필요하면 반복문으로 하나씩 돌린다.

함께 보면 좋은 명령어

  • catcat -n 은 빈 줄까지 무조건 번호를 매긴다. 단순 확인용으로는 이쪽이 낫다.
  • grepgrep -n 은 찾은 줄의 실제 번호를 알려 준다. 위치 확인의 첫 수단이다.
  • sedsed -n '10,20p' 로 원하는 범위를 먼저 잘라 낸 뒤 nl 에 넘기는 조합이 자주 쓰인다.