Linux nl 명령어: 줄 번호 매기기

LinuxBeginner
지금 연습하기

소개

이 튜토리얼에서는 텍스트 파일의 줄에 번호를 매길 때 사용하는 Linux의 nl 명령어를 살펴봅니다. 다양한 상황에서 이 명령어를 사용하는 방법을 익혀 문서의 특정 줄을 더 쉽게 참조할 수 있도록 합니다. 이 기능은 프로그래머, 시스템 관리자, 그리고 평소 텍스트 파일을 자주 다루는 모든 사람에게 특히 유용합니다.

여러분이 첫 대형 프로젝트를 맡은 주니어 소프트웨어 개발자라고 가정해 보겠습니다. 팀 리더가 설정 파일을 검토하고 특정 부분에 대해 논의해 달라고 요청했습니다. 이때 nl 명령어를 사용하면 파일의 특정 줄을 쉽게 가리키고 논의할 수 있어 협업 효율을 높일 수 있습니다.

기본적인 nl 명령어 이해하기

이 단계에서는 nl 명령어를 사용해 샘플 설정 파일을 확인합니다.

먼저 프로젝트 디렉터리로 이동합니다. 다음 명령어를 입력하고 Enter 키를 누르세요.

cd /home/labex/project

이 명령어는 현재 디렉터리를 샘플 파일이 있는 /home/labex/project로 변경합니다.

이제 nl 명령어를 사용해 줄 번호와 함께 config.txt의 내용을 확인합니다. 다음을 입력하세요.

nl config.txt | tee nl-basic.txt

다음과 비슷한 출력이 표시됩니다.

     1  ## Server Configuration
     2  port=8080
     3  max_connections=100
     4
     5  ## Database Settings
     6  db_host=localhost
     7  db_port=5432
     8  db_name=myapp
     ...

여기서 어떤 일이 일어나는지 살펴보겠습니다.

  • nl 명령어가 파일의 각 줄 왼쪽에 줄 번호를 추가합니다.
  • 번호는 너비가 6자인 열 안에서 오른쪽 정렬됩니다.
  • 원본 파일의 빈 줄(4번째 줄)은 기본적으로 번호가 매겨지지 않습니다.
  • tee 명령어는 출력을 화면에 표시하는 동시에 nl-basic.txt에 저장합니다.

이렇게 줄 번호를 표시하면 동료와 파일을 논의할 때 특정 줄을 쉽게 가리킬 수 있습니다. 예를 들어 “포트 번호를 확인하기 위해 2번째 줄을 보겠습니다”라고 말할 수 있습니다.

이와 같은 출력이 표시되지 않거나 오류가 발생한다면 올바른 디렉터리(/home/labex/project)에 있는지, 그리고 config.txt 파일이 존재하는지 확인하세요. 현재 디렉터리의 파일 목록은 ls 명령어로 확인할 수 있습니다.

빈 줄을 포함한 모든 줄에 번호 매기기

이 단계에서는 빈 줄을 포함한 모든 줄에 번호를 매깁니다. 빈 줄을 참조해야 하거나 빈 줄 자체가 중요한 파일을 다룰 때 유용합니다. 이를 위해 -b a 옵션을 사용합니다.

다음 명령어를 실행하세요.

nl -b a config.txt | tee nl-all-lines.txt

이제 다음과 비슷한 출력이 표시됩니다.

     1  ## Server Configuration
     2  port=8080
     3  max_connections=100
     4
     5  ## Database Settings
     6  db_host=localhost
     7  db_port=5432
     8  db_name=myapp
     ...

작동 방식을 살펴보겠습니다.

  • -b 옵션은 파일 본문의 줄 번호 매기기 방식을 제어합니다.
  • a 인수는 “all”을 의미하며, 빈 줄을 포함한 모든 줄에 번호를 매기도록 nl에 지시합니다.
  • 이전에는 번호가 없었던 4번째 빈 줄에도 이제 번호가 표시됩니다.
  • tee는 출력을 화면에 표시하고 nl-all-lines.txt에 저장합니다.

이 기능은 논의 중 빈 줄을 참조해야 하거나, 일부 프로그래밍 언어나 설정 파일처럼 빈 줄이 중요한 파일을 다룰 때 특히 유용합니다.

빈 줄에 번호가 표시되지 않는다면 명령어에 -b a 옵션이 포함되어 있는지 다시 확인하세요.

줄 번호 형식 사용자 지정하기

이 단계에서는 줄 번호가 표시되는 형식을 사용자 지정합니다. 가독성을 높이거나 출력을 추가로 처리할 때 유용합니다. 여기서는 번호를 오른쪽 정렬하고 앞에 0을 채워 보겠습니다.

-n rz 옵션을 사용하세요.

nl -n rz config.txt | tee nl-zero-padded.txt

출력은 다음과 같은 형태입니다.

000001  ## Server Configuration
000002  port=8080
000003  max_connections=100

000004  ## Database Settings
000005  db_host=localhost
000006  db_port=5432
000007  db_name=myapp

000008  ### Logging Configuration
000009  log_level=info
000010  log_file=/var/log/myapp.log

000011  ## Security Settings
000012  enable_ssl=true
000013  ssl_cert_path=/etc/ssl/certs/myapp.crt

000014  ### Performance Tuning
000015  cache_size=1024
000016  thread_pool=20

000017  ## Miscellaneous
000018  debug_mode=false

-n rz 옵션을 나누어 살펴보겠습니다.

  • -n은 줄 번호 표시 형식을 지정하는 데 사용됩니다.
  • r은 오른쪽 정렬을 의미합니다. 실제로 기본 설정도 오른쪽 정렬입니다.
  • z는 번호 앞에 0을 채우는 기능을 의미합니다.
  • tee는 출력을 화면에 표시하고 nl-zero-padded.txt에 저장합니다.

고정된 너비로 정렬되므로 다른 명령어를 사용해 출력을 정렬하거나 추가 처리해야 할 때 특히 유용한 형식입니다.

출력이 예시와 다르다면 -n rz 옵션을 포함해 명령어를 정확히 입력했는지 확인하세요.

특정 줄 유형에만 번호 매기기

이 단계에서는 nl을 사용해 특정 유형의 줄에만 번호를 매깁니다. 복잡한 파일에서 필요한 줄에만 집중하고 싶을 때 매우 유용합니다. 여기서는 비어 있지 않으면서 # 문자로 시작하지 않는 줄에만 번호를 매겨 보겠습니다. 설정 파일에서 #은 주석을 나타내는 경우가 많습니다.

다음 명령어를 사용하세요.

nl -b p'^[^#]' config.txt | tee nl-settings-only.txt

다음과 비슷한 출력이 표시됩니다.

       ## Server Configuration
     1  port=8080
     2  max_connections=100

       ## Database Settings
     3  db_host=localhost
     4  db_port=5432
     5  db_name=myapp

       ### Logging Configuration
     6  log_level=info
     7  log_file=/var/log/myapp.log

       ## Security Settings
     8  enable_ssl=true
     9  ssl_cert_path=/etc/ssl/certs/myapp.crt

       ### Performance Tuning
    10  cache_size=1024
    11  thread_pool=20

       ## Miscellaneous
    12  debug_mode=false

이 복합 명령어를 자세히 살펴보겠습니다.

  • -b p는 특정 패턴과 일치하는 줄에만 번호를 매기도록 nl에 지시합니다.
  • '^[^#]'은 정규 표현식 패턴입니다.
    • ^는 “줄의 시작”을 의미합니다.
    • [^#]#이 아닌 모든 문자를 의미합니다.
    • 따라서 두 표현식을 결합하면 #으로 시작하지 않는 모든 줄과 일치합니다.
  • tee는 출력을 화면에 표시하고 nl-settings-only.txt에 저장합니다.

이 명령어는 주석을 제외하고 실제 설정 내용에만 집중하고 싶을 때 유용합니다. 특히 대규모 설정 파일에서 실제 설정 항목을 빠르게 찾아 참조할 때 효과적입니다.

예상한 출력이 표시되지 않는다면 패턴을 감싼 작은따옴표를 포함해 명령어를 예시와 정확히 동일하게 입력했는지 확인하세요.

여러 옵션을 조합한 복합 번호 매기기

이 단계에서는 여러 nl 옵션을 조합해 보다 복잡한 번호 매기기 방식을 만들어 봅니다. 모든 줄에 번호를 매기고, 번호 형식을 사용자 지정하며, 번호 필드의 너비도 설정합니다.

다음 명령어를 실행하세요.

nl -b a -n rz -s ': ' -w 3 config.txt | tee nl-combined.txt

이 명령어는 다음 작업을 수행합니다.

  • -b a: 빈 줄을 포함한 모든 줄에 번호를 매깁니다.
  • -n rz: 번호를 오른쪽 정렬하고 앞에 0을 채웁니다.
  • -s ': ': 번호와 줄 내용 사이의 구분자로 ': '를 사용합니다.
  • -w 3: 번호 필드의 너비를 3자로 설정합니다.

다음과 비슷한 출력이 표시됩니다.

001: ## Server Configuration
002: port=8080
003: max_connections=100
004:
005: ## Database Settings
006: db_host=localhost
007: db_port=5432
008: db_name=myapp
009:
010: ### Logging Configuration
011: log_level=info
012: log_file=/var/log/myapp.log
013:
014: ## Security Settings
015: enable_ssl=true
016: ssl_cert_path=/etc/ssl/certs/myapp.crt
017:
018: ### Performance Tuning
019: cache_size=1024
020: thread_pool=20
021:
022: ## Miscellaneous
023: debug_mode=false

작동 방식을 정리하면 다음과 같습니다.

  • 빈 줄을 포함한 모든 줄에 번호가 매겨집니다.
  • 번호는 앞에 0이 채워진 상태로 오른쪽 정렬됩니다.
  • 번호와 줄 내용 사이의 구분자는 ': '입니다.
  • 번호 필드의 너비는 3자로 설정됩니다.
  • 화면에 표시된 출력은 nl-combined.txt에 저장됩니다.

이러한 복합 번호 매기기 방식은 구조화된 설정 파일이나 명확한 섹션으로 나뉜 문서를 다룰 때 매우 유용합니다. 각 섹션 안의 줄을 쉽게 참조할 수 있기 때문입니다.

출력이 예시와 정확히 일치하지 않는다면 입력한 명령어를 다시 확인하세요. 특히 공백과 특수 문자가 올바른지 주의 깊게 살펴보세요.

요약

이 튜토리얼에서는 텍스트 파일의 줄에 번호를 매기는 nl 명령어와 다양한 옵션을 살펴보았습니다. 다음 내용을 배웠습니다.

  1. 기본 nl 명령어를 사용해 파일에 줄 번호 추가하기
  2. -b a 옵션을 사용해 빈 줄을 포함한 모든 줄에 번호 매기기
  3. -n rz 옵션으로 번호 형식 사용자 지정하기
  4. 패턴 일치를 사용해 특정 유형의 줄에만 번호 매기기
  5. 여러 옵션을 조합해 복합적인 번호 매기기 방식 만들기

이러한 기능을 익히면 개발 프로젝트에서 다루는 설정 파일, 소스 코드 및 각종 텍스트 파일의 줄을 더 쉽게 탐색하고 참조할 수 있습니다.

이 튜토리얼에서 다루지 않은 추가 nl 명령어 옵션은 다음과 같습니다.

  • -v NUM: 1이 아닌 NUM부터 번호 매기기 시작
  • -i NUM: 1이 아닌 NUM만큼씩 번호 증가
  • -l NUM: NUM개의 줄을 하나의 그룹으로 묶고 각 그룹의 첫 번째 줄에만 번호 매기기
  • -f a: 모든 헤더 줄(첫 번째 본문 줄 이전의 줄)에 번호 매기기

이러한 옵션을 활용하면 nl 명령어를 더욱 유연하게 사용할 수 있습니다.