Bạn đã từng muốn đánh số dòng trong một tệp văn bản trên Linux một cách nhanh chóng và chính xác chưa? Đối với các lập trình viên, quản trị viên hệ thống hay bất kỳ ai thường xuyên làm việc với các tệp tin lớn như logs, mã nguồn hoặc tài liệu, việc đánh số dòng thủ công không chỉ tốn thời gian mà còn rất dễ gây ra nhầm lẫn. Những sai sót nhỏ trong việc xác định vị trí dòng có thể dẫn đến khó khăn trong việc gỡ lỗi, phân tích dữ liệu hoặc cộng tác với người khác. May mắn thay, Linux cung cấp một công cụ mạnh mẽ và linh hoạt để giải quyết vấn đề này, đó chính là lệnh nl. Lệnh này sẽ giúp bạn tự động hóa hoàn toàn quá trình đánh số, giúp bạn tập trung vào những công việc quan trọng hơn. Bài viết này sẽ cung cấp một cái nhìn toàn diện về lệnh nl, từ khái niệm, cú pháp, các tham số phổ biến cho đến những ví dụ và ứng dụng thực tế trong công việc hàng ngày.
Tổng quan về lệnh nl trong Linux
Lệnh nl là một công cụ tiện ích mạnh mẽ trong hệ điều hành Linux, được thiết kế để giúp người dùng quản lý và xử lý các tệp văn bản một cách hiệu quả hơn. Hãy cùng tìm hiểu sâu hơn về khái niệm và chức năng cốt lõi của nó.
Lệnh nl là gì?
nl là viết tắt của “number lines” (đánh số các dòng). Đúng như tên gọi, mục đích chính của lệnh này là đọc các tệp tin (hoặc dữ liệu đầu vào tiêu chuẩn) và xuất ra nội dung đó kèm theo số dòng được thêm vào phía trước. Về cơ bản, nó giúp bạn tạo ra một phiên bản được đánh số của một tệp văn bản bất kỳ.
Nhiều người có thể so sánh nl với lệnh cat -n. Lệnh cat -n cũng có khả năng đánh số dòng, nhưng nó chỉ thực hiện một tác vụ duy nhất: đánh số tất cả các dòng, bao gồm cả những dòng trống. Ngược lại, nl cung cấp sự linh hoạt vượt trội. Bạn có thể tùy chỉnh cách đánh số, ví dụ như chỉ đánh số những dòng có nội dung, bỏ qua các dòng trống, định dạng kiểu số (thêm số 0 ở đầu, căn lề trái/phải), thay đổi ký tự phân cách và nhiều hơn thế nữa. Chính sự tùy biến mạnh mẽ này đã làm cho nl trở thành công cụ được ưa chuộng hơn trong các tác vụ xử lý văn bản phức tạp.
Chức năng chính của lệnh nl
Sức mạnh của lệnh nl không chỉ nằm ở việc thêm một con số vào đầu mỗi dòng. Nó mang lại nhiều lợi ích thiết thực giúp công việc của bạn trở nên dễ dàng và chính xác hơn.
Chức năng quan trọng nhất là đánh số dòng tự động. Thay vì phải đếm thủ công, bạn chỉ cần một câu lệnh đơn giản để hoàn thành công việc trong vài giây, dù tệp tin có hàng trăm hay hàng nghìn dòng. Điều này đặc biệt hữu ích khi làm việc với các tệp mã nguồn, nơi việc tham chiếu đến một dòng cụ thể là rất quan trọng trong quá trình gỡ lỗi hoặc đánh giá mã. Bạn có thể tìm hiểu thêm về Bash là gì để biết cách sử dụng lệnh này trong shell.
Thứ hai, nl hỗ trợ đánh số thông minh theo điều kiện và định dạng. Đây là điểm khác biệt lớn nhất so với các lệnh khác. Bạn có thể ra lệnh cho nl chỉ đánh số những dòng không rỗng (-b t), giúp bạn tập trung vào phần nội dung thực sự của tệp. Bạn cũng có thể kiểm soát hoàn toàn định dạng của số dòng, từ chiều rộng của cột số (-w), kiểu định dạng (-n), cho đến ký tự ngăn cách giữa số và nội dung (-s).
Cuối cùng, việc sử dụng nl giúp tăng hiệu quả khi làm việc với nhiều tệp văn bản. Khi kết hợp với các lệnh khác như grep, awk hay sed thông qua cơ chế “pipe”, nl trở thành một mắt xích quan trọng trong chuỗi xử lý dữ liệu, cho phép bạn lọc, trích xuất và biến đổi thông tin dựa trên vị trí dòng một cách chính xác.
Cú pháp cơ bản và các tham số phổ biến của lệnh nl
Để khai thác tối đa sức mạnh của lệnh nl, việc nắm vững cú pháp và các tham số của nó là điều cần thiết. Cấu trúc lệnh khá đơn giản nhưng các tùy chọn đi kèm lại mang đến khả năng tùy biến rất cao.
Cú pháp cơ bản của lệnh nl
Cú pháp tổng quát của lệnh nl như sau:nl [TÙY CHỌN]... [TẬP TIN]...
Hãy cùng phân tích từng thành phần:
nl: Là tên lệnh mà bạn gọi để thực thi.[TÙY CHỌN]...(Options): Đây là các cờ hoặc tham số bạn sử dụng để thay đổi hành vi mặc định của lệnh. Bạn có thể sử dụng một hoặc nhiều tùy chọn cùng lúc. Ví dụ, bạn có thể chỉ định cách đánh số, định dạng số, ký tự phân cách, và nhiều hơn nữa.[TẬP TIN]...(File): Đây là tên của một hoặc nhiều tệp tin mà bạn muốn đánh số dòng. Nếu bạn không cung cấp tên tệp nào,nlsẽ đọc dữ liệu từ đầu vào tiêu chuẩn (standard input), cho phép bạn kết hợp nó với các lệnh khác thông qua pipe.
Ví dụ, một lệnh đơn giản nhất sẽ là nl myfile.txt, lệnh này sẽ đánh số các dòng không trống trong tệp myfile.txt và hiển thị kết quả ra màn hình.

Các tham số và tùy chọn phổ biến
Lệnh nl trở nên thực sự hữu ích nhờ vào các tham số tùy chỉnh của nó. Dưới đây là những tham số quan trọng và thường được sử dụng nhất:
-b <kiểu>(body numbering): Tùy chọn này quyết định những dòng nào trong phần thân tệp sẽ được đánh số.a: Đánh số tất cả các dòng (all), bao gồm cả dòng trống.t: Chỉ đánh số những dòng không trống (non-empty lines). Đây là tùy chọn mặc định.n: Không đánh số dòng nào cả (no numbering).p<biểu_thức>: Chỉ đánh số những dòng khớp với một biểu thức chính quy (regular expression).
-n <định_dạng>(number format): Tùy chọn này kiểm soát cách định dạng của số dòng.ln: Căn lề trái, không có số 0 ở đầu (left justified).rn: Căn lề phải, không có số 0 ở đầu (right justified). Đây là mặc định.rz: Căn lề phải và thêm các số 0 ở đầu cho đủ chiều rộng (right justified with leading zeros).
-w <số>(width): Tham số này xác định chiều rộng (số ký tự) của cột chứa số dòng. Giá trị mặc định là 6.-s <chuỗi>(separator): Cho phép bạn chỉ định chuỗi ký tự sẽ được sử dụng để ngăn cách giữa cột số dòng và nội dung của dòng. Mặc định là một ký tự tab (\t).-v <số>(starting number): Dùng để thiết lập số bắt đầu cho việc đánh số dòng. Mặc định là 1.-i <số>(increment): Xác định bước nhảy cho số dòng. Ví dụ,-i 5sẽ đánh số là 1, 6, 11,… Mặc định là 1.
Ví dụ, để đánh số tất cả các dòng trong tệp script.sh, bắt đầu từ 1, với số dòng có 3 chữ số, thêm số 0 ở đầu, và dùng dấu chấm theo sau là một khoảng trắng làm phân cách, bạn có thể dùng lệnh: nl -b a -n rz -w 3 -s ". " script.sh.

Ví dụ minh họa cách sử dụng lệnh nl
Lý thuyết sẽ dễ hiểu hơn rất nhiều khi đi kèm với các ví dụ thực tế. Phần này sẽ hướng dẫn bạn từ cách sử dụng cơ bản nhất cho đến các kịch bản phức tạp hơn với những tham số tùy chỉnh.
Ví dụ đơn giản đánh số dòng trong file văn bản
Hãy bắt đầu với một kịch bản đơn giản nhất. Giả sử chúng ta có một tệp văn bản tên là danhsach.txt với nội dung như sau:
Sản phẩm A Sản phẩm B Sản phẩm C
Bây giờ, hãy mở terminal và chạy lệnh nl với tệp này:nl danhsach.txt
Kết quả bạn nhận được sẽ là:
1 Sản phẩm A
2 Sản phẩm B
3 Sản phẩm C

Giải thích kết quả:
- Lệnh
nlđã tự động thêm số thứ tự vào đầu mỗi dòng có chứa nội dung. - Các dòng trống (dòng thứ 2 và 5 trong tệp gốc) đã bị bỏ qua và không được đánh số. Điều này xảy ra vì hành vi mặc định của
nltương đương với việc sử dụng tham số-b t(chỉ đánh số các dòng không trống). - Mặc định, cột số được căn lề phải và có chiều rộng là 6 ký tự.
- Giữa số thứ tự và nội dung dòng là một ký tự tab, đây là ký tự phân cách mặc định.
Cách sử dụng cơ bản này rất hữu ích khi bạn muốn nhanh chóng xem số lượng các mục có nội dung trong một danh sách hoặc một tệp cấu hình đơn giản.
Ví dụ nâng cao với tham số tùy chỉnh
Bây giờ, hãy khám phá sức mạnh thực sự của nl bằng cách kết hợp các tham số để tùy chỉnh đầu ra theo ý muốn. Vẫn sử dụng tệp danhsach.txt ở trên.
Kịch bản 1: Đánh số tất cả các dòng, bao gồm cả dòng trống.
Nếu bạn muốn đánh số cả những dòng trống để biết chính xác vị trí của chúng trong tệp, bạn có thể sử dụng tham số -b a:nl -b a danhsach.txt
Kết quả sẽ là:
1 Sản phẩm A
2
3 Sản phẩm B
4 Sản phẩm C
5

Kịch bản 2: Tùy chỉnh định dạng số dòng.
Giả sử bạn muốn số dòng hiển thị gọn hơn, chỉ cần 2 chữ số, có số 0 ở đầu (ví dụ: 01, 02), và sử dụng dấu chấm phẩy (;) làm ký tự phân cách. Bạn có thể kết hợp các tham số -w, -n, và -s:nl -b a -w 2 -n rz -s ";" danhsach.txt
Kết quả đầu ra sẽ trông chuyên nghiệp và gọn gàng hơn rất nhiều:
01;Sản phẩm A 02; 03;Sản phẩm B 04;Sản phẩm C 05;
Qua các ví dụ này, bạn có thể thấy rằng nl không chỉ là một công cụ đánh số đơn thuần. Nó cho phép bạn kiểm soát hoàn toàn định dạng đầu ra, biến những tệp văn bản thô trở nên có cấu trúc và dễ đọc hơn, phù hợp với nhiều mục đích sử dụng khác nhau.
Ứng dụng thực tế của lệnh nl trong quản lý tệp tin
Ngoài việc đánh số dòng đơn thuần, lệnh nl còn là một trợ thủ đắc lực trong nhiều công việc quản lý và xử lý tệp tin hàng ngày, đặc biệt khi được kết hợp với các công cụ mạnh mẽ khác của Linux.
Quản lý và sửa file văn bản có nhiều dòng
Trong môi trường làm việc chuyên nghiệp, chúng ta thường xuyên phải đối mặt với các tệp tin có dung lượng lớn và hàng nghìn dòng. Đây là lúc nl phát huy giá trị của mình.
- Phân tích tệp logs: Khi một ứng dụng gặp sự cố, tệp log là nơi đầu tiên các quản trị viên hệ thống tìm đến. Thông báo lỗi thường đi kèm với số dòng cụ thể nơi sự cố xảy ra. Sử dụng lệnh
nl application.logsẽ giúp bạn ngay lập tức định vị được dòng lỗi đó trong một tệp log khổng lồ, tiết kiệm rất nhiều thời gian so với việc cuộn và đếm thủ công. Tham khảo thêm về Linux là gì để hiểu rõ hơn môi trường thực thi lệnh này. - Làm việc với mã nguồn: Đối với lập trình viên, việc tham chiếu đến số dòng là hoạt động diễn ra hàng ngày, từ việc thảo luận với đồng nghiệp (“xem lại logic ở dòng 254”), gỡ lỗi (debugger báo lỗi ở dòng 123), cho đến việc tạo các bản vá (patch). Lệnh
nlgiúp hiển thị mã nguồn một cách có trật tự, dễ dàng cho việc tham chiếu và trao đổi thông tin. - Tạo báo cáo và tài liệu: Khi soạn thảo các tài liệu kỹ thuật hoặc báo cáo cần trích dẫn nội dung từ một tệp cấu hình hoặc tệp dữ liệu, việc sử dụng
nlđể đánh số các dòng trích dẫn sẽ làm cho tài liệu của bạn trở nên rõ ràng và chuyên nghiệp hơn. Người đọc có thể dễ dàng đối chiếu thông tin với tệp gốc.

Kết hợp lệnh nl với các lệnh Linux khác
Sức mạnh thực sự của các công cụ dòng lệnh trong Linux nằm ở khả năng kết hợp chúng lại với nhau thông qua “pipe” (|). nl cũng không ngoại lệ và trở nên cực kỳ hữu ích khi phối hợp với các lệnh khác.
- Kết hợp với
grep: Giả sử bạn muốn tìm tất cả các dòng chứa từ “ERROR” trong một tệp log và muốn biết chúng là những dòng thứ mấy trong kết quả lọc được. Bạn có thể dùng lệnh:grep "ERROR" system.log | nl
Lệnh này trước tiên sẽ dùnggrepđể lọc ra tất cả các dòng chứa “ERROR”, sau đó kết quả này được chuyển qua chonlđể đánh số thứ tự. Bạn sẽ biết ngay có bao nhiêu lỗi và thứ tự của chúng. - Kết hợp với
headhoặctail: Bạn muốn xem 10 dòng đầu tiên của một tệp và đánh số chúng? Rất đơn giản:head -n 10 config.ini | nl
Điều này hữu ích khi bạn chỉ muốn kiểm tra một phần nhỏ của tệp mà không cần mở toàn bộ. - Kết hợp với
sedhoặcawk: Trong các kịch bản xử lý văn bản phức tạp, bạn có thể dùngnlđể thêm số dòng vào tệp, sau đó dùngawkđể thực hiện các hành động trên những dòng có số thứ tự chẵn, hoặc dùngsedđể chỉnh sửa một phạm vi dòng cụ thể (ví dụ: từ dòng 50 đến 70).nl data.csv | awk '$1 % 2 == 0 {print $0}'(In ra các dòng được đánh số chẵn).

Việc kết hợp linh hoạt nl với các lệnh khác mở ra vô số khả năng, giúp bạn tự động hóa các tác vụ lặp đi lặp lại và xử lý dữ liệu văn bản một cách hiệu quả và chính xác.

Các vấn đề thường gặp khi sử dụng lệnh nl
Mặc dù lệnh nl khá đơn giản và dễ sử dụng, người dùng mới đôi khi cũng có thể gặp phải một số tình huống mà kết quả không như mong đợi. Dưới đây là hai vấn đề phổ biến và cách để khắc phục chúng.
Lệnh nl không đánh số dòng như mong muốn
Đây là sự cố phổ biến nhất, đặc biệt là với những người chưa quen với hành vi mặc định của lệnh.
- Nguyên nhân: Lý do chính thường là do người dùng quên rằng
nlmặc định chỉ đánh số các dòng không trống (tương đương với-b t). Khi bạn chạy lệnhnl ten_tep.txttrên một tệp có nhiều dòng trống xen kẽ, bạn sẽ thấy các dòng trống đó bị bỏ qua, và thứ tự số dòng không liên tục. Điều này có thể gây nhầm lẫn nếu bạn mong đợi tất cả các dòng đều được đánh số. Một nguyên nhân khác có thể là do bạn đã nhập sai tham số, ví dụ nhưnl -bathay vìnl -b a. - Cách khắc phục:
- Kiểm tra lại mục đích: Hãy tự hỏi bạn muốn đánh số tất cả các dòng hay chỉ những dòng có nội dung.
- Sử dụng tham số
-b a: Nếu bạn muốn tất cả các dòng, kể cả dòng trống, được đánh số, hãy luôn sử dụng tham số-b amột cách tường minh. Ví dụ:nl -b a ten_tep.txt. - Đọc tài liệu hướng dẫn: Khi nghi ngờ về một tham số nào đó, hãy sử dụng lệnh
man nlđể mở trang hướng dẫn chi tiết về lệnhnl. Nó sẽ cung cấp danh sách đầy đủ các tùy chọn và cách sử dụng chính xác.
![]()
Không thể đánh số dòng trên tập tin có mã hóa đặc biệt
Đôi khi, bạn có thể gặp phải tình huống lệnh nl trả về kết quả lạ, các ký tự bị lỗi hoặc thậm chí không hoạt động trên một tệp văn bản trông có vẻ bình thường.
- Vấn đề với encoding: Lệnh
nlvà hầu hết các công cụ dòng lệnh của Linux hoạt động tốt nhất với các tệp văn bản được mã hóa theo chuẩn ASCII hoặc UTF-8. Tuy nhiên, các tệp được tạo ra từ hệ điều hành Windows hoặc các ứng dụng khác có thể sử dụng bảng mã khác như UTF-16, ISO-8859-1, hoặc Windows-1252. Đặc biệt, cách các hệ điều hành khác nhau biểu diễn ký tự xuống dòng (Line Endings) cũng khác nhau (LF trên Linux/macOS và CRLF trên Windows).nlcó thể không nhận diện đúng ký tự xuống dòng hoặc các ký tự đặc biệt trong các bảng mã này, dẫn đến việc xử lý sai. - Gợi ý kiểm tra và khắc phục:
- Sử dụng lệnh
file: Đây là bước đầu tiên để chẩn đoán. Chạy lệnhfile ten_tep.txt. Lệnh này sẽ phân tích tệp và cho bạn biết loại mã hóa ký tự (character encoding) của nó. Ví dụ, nó có thể trả về “UTF-8 Unicode text” hoặc “ISO-8859 text, with CRLF line terminators”. - Chuyển đổi encoding: Nếu tệp không phải là UTF-8, bạn nên chuyển đổi nó. Công cụ
iconvlà lựa chọn hoàn hảo cho việc này. Ví dụ, để chuyển một tệp từ Windows-1252 sang UTF-8, bạn có thể dùng lệnh:iconv -f WINDOWS-1252 -t UTF-8 input.txt > output.txt. - Chuyển đổi ký tự xuống dòng: Nếu vấn đề là do ký tự xuống dòng (CRLF), bạn có thể dùng các công cụ như
dos2unixđể chuyển đổi tệp về định dạng của Unix/Linux. Cài đặt nó (nếu chưa có) và chạydos2unix ten_tep.txt.
- Sử dụng lệnh
Bằng cách đảm bảo tệp của bạn có định dạng và mã hóa chuẩn, bạn sẽ giúp nl và các công cụ khác hoạt động một cách chính xác và đáng tin cậy.
Những lưu ý và mẹo khi dùng lệnh nl
Để sử dụng lệnh nl một cách hiệu quả và an toàn, hãy ghi nhớ một vài lưu ý quan trọng và các mẹo nhỏ sau đây. Chúng sẽ giúp bạn tránh được những sai sót không đáng có và tối ưu hóa quy trình làm việc của mình.
- Sử dụng tham số phù hợp theo mục đích: Luôn xác định rõ bạn muốn đạt được điều gì trước khi chạy lệnh. Nếu cần đánh số tất cả các dòng để tham chiếu chính xác vị trí, hãy dùng
-b a. Nếu chỉ quan tâm đến các dòng chứa nội dung, hãy giữ nguyên mặc định hoặc chỉ định rõ-b t. Việc lựa chọn đúng tham số ngay từ đầu sẽ giúp kết quả đầu ra có ý nghĩa và tránh gây nhầm lẫn. - Không dùng lệnh nl cho tập tin nhị phân: Lệnh
nlđược thiết kế để làm việc với các tệp văn bản (text files). Việc cố gắng chạy nó trên các tệp nhị phân như hình ảnh (.jpg,.png), tệp thực thi, hoặc tài liệu Word (.docx) sẽ tạo ra kết quả vô nghĩa hoặc một chuỗi các ký tự lộn xộn trên màn hình terminal của bạn. Hãy luôn dùng lệnhfileđể kiểm tra loại tệp trước nếu bạn không chắc chắn. - Kết hợp đúng với các trình soạn thảo và công cụ khác: Sức mạnh của
nlđược nhân lên khi bạn biết cách tích hợp nó vào quy trình làm việc. Ví dụ, bạn có thể chạynl my_code.pytrong terminal, sau đó sao chép kết quả vào email hoặc tài liệu báo cáo để thảo luận với đồng nghiệp. Hoặc bạn có thể chuyển hướng đầu ra củanlvào một tệp mới (nl script.js > script_numbered.js) để lưu trữ một phiên bản đã được đánh số. - Luôn kiểm tra kết quả sau khi xử lý: Đây là một thói quen tốt khi làm việc trên dòng lệnh, đặc biệt là trước khi thực hiện các thao tác mang tính phá hủy hoặc ghi đè. Sau khi chạy
nl, hãy dành một giây để liếc qua vài dòng đầu và cuối của kết quả để đảm bảo nó đúng như bạn mong đợi. Điều này đặc biệt quan trọng khi bạn chuẩn bị dùng kết quả đó làm đầu vào cho một lệnh khác trong một chuỗi xử lý phức tạp. - Tạo bí danh (alias) cho các lệnh thường dùng: Nếu bạn thường xuyên sử dụng
nlvới một bộ tham số cố định, ví dụ nhưnl -b a -n rz -w 4, bạn có thể tạo một bí danh trong tệp cấu hình shell của mình (ví dụ.bashrchoặc.zshrc). Chẳng hạn:alias nla="nl -b a -n rz -w 4". Từ đó, bạn chỉ cần gõnla ten_tep.txtlà có thể thực hiện lệnh phức tạp đó một cách nhanh chóng.

Bằng cách áp dụng những mẹo này, bạn sẽ biến nl từ một công cụ đơn giản thành một trợ lý đắc lực và đáng tin cậy trong công việc hàng ngày.
Kết luận
Qua bài viết này, chúng ta đã cùng nhau khám phá một cách toàn diện về lệnh nl trong Linux, một công cụ tuy nhỏ gọn nhưng lại vô cùng hữu ích. Từ việc tìm hiểu khái niệm cơ bản, nắm vững cú pháp và các tham số tùy chỉnh, cho đến việc xem xét các ví dụ minh họa và ứng dụng thực tế, có thể thấy rằng nl không chỉ đơn thuần là một lệnh để đánh số dòng. Nó là một giải pháp hiệu quả giúp tăng cường sự rõ ràng, chính xác và hiệu suất khi làm việc với các tệp văn bản, đặc biệt là các tệp mã nguồn, tệp cấu hình và logs hệ thống.
Lợi ích chính mà nl mang lại là khả năng tự động hóa một công việc thủ công nhàm chán, giải phóng thời gian và trí óc của bạn để tập trung vào các tác vụ có giá trị hơn. Khả năng tùy biến định dạng và kết hợp mượt mà với các lệnh khác như grep, awk, sed biến nó thành một mắt xích quan trọng trong bộ công cụ của bất kỳ ai làm việc thường xuyên trên môi trường dòng lệnh.
AZWEB khuyến khích bạn hãy bắt đầu áp dụng lệnh nl vào quy trình làm việc hàng ngày của mình. Hãy thử nghiệm với các tham số khác nhau, kết hợp nó với các lệnh bạn đã biết để giải quyết những vấn đề cụ thể của bạn. Việc thành thạo những công cụ như nl chính là chìa khóa để tối ưu hóa công việc, giảm thiểu sai sót và nâng cao kỹ năng quản trị hệ thống cũng như xử lý dữ liệu của bạn. Đừng dừng lại ở đây, hãy tiếp tục khám phá kho tàng các lệnh Linux hữu ích khác để trở thành một người dùng quyền lực và hiệu quả hơn.