소개
이 튜토리얼에서는 텍스트 파일의 각 줄에 번호를 매길 때 사용하는 Linux 의 nl 명령어를 살펴봅니다. 다양한 상황에서 이 명령어를 활용하는 방법을 익히면, 문서 내의 특정 위치를 지칭하거나 참조하기가 훨씬 수월해집니다. 이 기술은 프로그래머, 시스템 관리자뿐만 아니라 텍스트 파일을 자주 다루는 모든 사용자에게 매우 유용합니다.
여러분이 이제 막 첫 대형 프로젝트를 시작한 주니어 소프트웨어 개발자라고 가정해 봅시다. 팀장님이 설정 파일을 검토하고 특정 섹션에 대해 논의하자고 요청했습니다. 이때 nl 명령어를 사용하면 파일의 특정 행을 쉽게 지목하고 소통할 수 있어 협업 효율이 크게 향상됩니다.
nl 명령어의 기본 사용법 이해하기
먼저 nl 명령어를 사용하여 샘플 설정 파일을 확인해 보겠습니다.
- 우선 프로젝트 디렉터리로 이동합니다. 다음 명령어를 입력하고 Enter 키를 누르세요.
cd /home/labex/project
이 명령어는 현재 작업 디렉터리를 샘플 파일이 위치한 /home/labex/project로 변경합니다.
- 이제
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
정리하자면 다음과 같은 변화가 일어났습니다.
- 빈 줄을 포함한 모든 행에 번호가 붙었습니다.
- 번호는 3 자리 너비 내에서 0 으로 채워진 채 오른쪽으로 정렬되었습니다.
- 번호와 텍스트 사이에 콜론과 공백 (': ') 이 구분자로 추가되었습니다.
이러한 복잡한 설정은 구조화된 설정 파일이나 섹션이 나뉜 문서를 다룰 때 매우 유용하며, 문서의 가독성을 높여줍니다.
출력이 위와 다르다면 입력한 명령어의 공백과 특수 문자를 주의 깊게 확인해 보세요.
요약
이 튜토리얼에서는 텍스트 파일의 행 번호를 관리하는 nl 명령어와 그 다양한 옵션들을 살펴보았습니다. 우리가 배운 내용은 다음과 같습니다.
- 기본적인
nl명령어로 파일에 행 번호 추가하기 -b a옵션으로 빈 줄을 포함한 모든 행에 번호 매기기-n rz옵션으로 번호 표시 형식 사용자 정의하기- 패턴 매칭을 사용하여 특정 유형의 행에만 번호 매기기
- 여러 옵션을 조합하여 정교한 번호 체계 구축하기
이러한 기술은 설정 파일, 소스 코드 또는 개발 프로젝트에서 다루는 모든 텍스트 파일을 더 효율적으로 탐색하고 참조하는 데 도움이 될 것입니다.
이 튜토리얼에서 다루지 않은 추가적인 nl 옵션들은 다음과 같습니다.
-v NUM: 번호를 1 이 아닌 NUM 부터 시작합니다.-i NUM: 번호 증가 폭을 1 이 아닌 NUM 으로 설정합니다.-l NUM: NUM 개의 행을 하나의 그룹으로 묶어 각 그룹의 첫 번째 행에만 번호를 매깁니다.-f a: 모든 헤더 행 (첫 번째 본문 행 이전의 행들) 에 번호를 매깁니다.
이러한 옵션들을 활용하면 nl 명령어를 더욱 유연하게 사용할 수 있습니다.



