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

LinuxBeginner
지금 연습하기

소개

이 튜토리얼에서는 텍스트 파일의 각 줄에 번호를 매길 때 사용하는 Linux 의 nl 명령어를 살펴봅니다. 다양한 상황에서 이 명령어를 활용하는 방법을 익히면, 문서 내의 특정 위치를 지칭하거나 참조하기가 훨씬 수월해집니다. 이 기술은 프로그래머, 시스템 관리자뿐만 아니라 텍스트 파일을 자주 다루는 모든 사용자에게 매우 유용합니다.

여러분이 이제 막 첫 대형 프로젝트를 시작한 주니어 소프트웨어 개발자라고 가정해 봅시다. 팀장님이 설정 파일을 검토하고 특정 섹션에 대해 논의하자고 요청했습니다. 이때 nl 명령어를 사용하면 파일의 특정 행을 쉽게 지목하고 소통할 수 있어 협업 효율이 크게 향상됩니다.

이 실습은 단계별 안내를 통해 학습과 연습을 돕는 가이드 랩 (Guided Lab) 입니다. 각 단계를 주의 깊게 따라가며 직접 실습해 보세요. 통계에 따르면 이 실습은 초급 수준이며, 99%의 완수율과 학습자들로부터 99%의 긍정적인 평가를 기록하고 있습니다.

nl 명령어의 기본 사용법 이해하기

먼저 nl 명령어를 사용하여 샘플 설정 파일을 확인해 보겠습니다.

  1. 우선 프로젝트 디렉터리로 이동합니다. 다음 명령어를 입력하고 Enter 키를 누르세요.
cd /home/labex/project

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

  1. 이제 nl 명령어를 사용하여 config.txt 파일의 내용을 행 번호와 함께 출력해 보겠습니다. 다음과 같이 입력하세요.
nl config.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 행) 에는 기본적으로 번호가 매겨지지 않습니다.

이렇게 번호를 매기면 동료들과 파일을 검토할 때 매우 편리합니다. 예를 들어 "2 행을 보고 포트 번호를 확인해 봅시다"라고 명확하게 소통할 수 있습니다.

만약 출력이 나타나지 않거나 오류가 발생한다면, 현재 위치가 /home/labex/project인지, 그리고 config.txt 파일이 실제로 존재하는지 확인하세요. ls 명령어를 사용하여 현재 디렉터리의 파일 목록을 확인할 수 있습니다.

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

때로는 빈 줄을 포함하여 모든 행에 번호를 매겨야 할 때가 있습니다. 빈 줄 자체를 참조해야 하거나, 빈 줄이 중요한 의미를 갖는 파일을 다룰 때 유용합니다. 이를 위해 -b a 옵션을 사용해 보겠습니다.

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

nl -b a config.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 행 (빈 줄) 에 이제 번호가 붙은 것을 확인할 수 있습니다.

이 방식은 특정 프로그래밍 언어나 설정 파일처럼 빈 줄이 구조적으로 의미가 있는 문서를 다룰 때 특히 유용합니다.

빈 줄에 번호가 나타나지 않는다면 명령어에 -b a 옵션이 정확히 포함되었는지 다시 확인해 보세요.

번호 형식 사용자 정의하기

nl 명령어를 사용하면 행 번호가 표시되는 방식을 원하는 대로 바꿀 수 있습니다. 가독성을 높이거나 출력 결과를 다른 프로그램의 입력값으로 사용할 때 유용합니다. 이번에는 번호를 오른쪽으로 정렬하고 앞부분을 0 으로 채워 보겠습니다.

-n rz 옵션을 사용합니다.

nl -n rz config.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은 오른쪽 정렬 (Right-aligned) 을 의미합니다 (기본값입니다).
  • z는 남는 공간을 0 으로 채우는 것 (Leading Zeros) 을 의미합니다.

이러한 고정 너비 형식은 출력 결과를 다른 명령어로 정렬하거나 가공할 때 정렬 상태를 일정하게 유지해 주므로 매우 편리합니다.

출력 결과가 위와 다르다면 -n rz 옵션을 포함하여 명령어를 정확히 입력했는지 확인하세요.

특정 유형의 행에만 번호 매기기

nl 명령어는 특정 조건을 만족하는 행에만 번호를 매길 수 있습니다. 복잡한 파일에서 특정 내용에만 집중하고 싶을 때 매우 유용합니다. 이번에는 설정 파일에서 주석으로 사용되는 '#'으로 시작하는 줄을 제외하고, 실제 내용이 있는 줄에만 번호를 매겨 보겠습니다.

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

nl -b p'^[^#]' config.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는 특정 패턴 (Pattern) 과 일치하는 행에만 번호를 매기도록 지시합니다.
  • '^[^#]'는 정규 표현식 패턴입니다.
    • ^는 "줄의 시작"을 의미합니다.
    • [^#]는 "#이 아닌 모든 문자"를 의미합니다.
    • 따라서 이 패턴은 #으로 시작하지 않는 모든 행과 일치하게 됩니다.

이 명령어는 주석을 무시하고 실제 활성화된 설정 값들만 확인하고 싶을 때 유용합니다. 특히 규모가 큰 설정 파일에서 실제 설정 항목을 빠르게 식별하고 참조하는 데 큰 도움이 됩니다.

예상한 결과가 나오지 않는다면 패턴을 감싸는 작은따옴표를 포함하여 명령어를 정확히 입력했는지 다시 확인하세요.

여러 옵션을 조합하여 복잡한 번호 체계 만들기

지금까지 배운 nl 명령어의 다양한 옵션들을 조합하여 더 정교한 번호 체계를 만들어 보겠습니다. 모든 행에 번호를 매기되, 사용자 정의 형식을 사용하고 번호 필드의 너비를 조정해 보겠습니다.

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

nl -b a -n rz -s ': ' -w 3 config.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

정리하자면 다음과 같은 변화가 일어났습니다.

  1. 빈 줄을 포함한 모든 행에 번호가 붙었습니다.
  2. 번호는 3 자리 너비 내에서 0 으로 채워진 채 오른쪽으로 정렬되었습니다.
  3. 번호와 텍스트 사이에 콜론과 공백 (': ') 이 구분자로 추가되었습니다.

이러한 복잡한 설정은 구조화된 설정 파일이나 섹션이 나뉜 문서를 다룰 때 매우 유용하며, 문서의 가독성을 높여줍니다.

출력이 위와 다르다면 입력한 명령어의 공백과 특수 문자를 주의 깊게 확인해 보세요.

요약

이 튜토리얼에서는 텍스트 파일의 행 번호를 관리하는 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 명령어를 더욱 유연하게 사용할 수 있습니다.

참고 자료