소개
이 튜토리얼에서는 텍스트 파일의 줄에 번호를 매길 때 사용하는 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 명령어와 다양한 옵션을 살펴보았습니다. 다음 내용을 배웠습니다.
- 기본
nl명령어를 사용해 파일에 줄 번호 추가하기 -b a옵션을 사용해 빈 줄을 포함한 모든 줄에 번호 매기기-n rz옵션으로 번호 형식 사용자 지정하기- 패턴 일치를 사용해 특정 유형의 줄에만 번호 매기기
- 여러 옵션을 조합해 복합적인 번호 매기기 방식 만들기
이러한 기능을 익히면 개발 프로젝트에서 다루는 설정 파일, 소스 코드 및 각종 텍스트 파일의 줄을 더 쉽게 탐색하고 참조할 수 있습니다.
이 튜토리얼에서 다루지 않은 추가 nl 명령어 옵션은 다음과 같습니다.
-v NUM: 1이 아닌 NUM부터 번호 매기기 시작-i NUM: 1이 아닌 NUM만큼씩 번호 증가-l NUM: NUM개의 줄을 하나의 그룹으로 묶고 각 그룹의 첫 번째 줄에만 번호 매기기-f a: 모든 헤더 줄(첫 번째 본문 줄 이전의 줄)에 번호 매기기
이러한 옵션을 활용하면 nl 명령어를 더욱 유연하게 사용할 수 있습니다.



