nl 為文件加上行號
在 Linux 系統管理與程式開發的日常工作中,我們經常需要處理大量的純文字檔、日誌檔(log files)或是腳本程式碼。當文件內容變得龐大且複雜時,快速定位特定段落或行數變得至關重要。雖然 grep 或 less 也能協助搜尋,但它們無法直接提供「相對位置」的概念。這時,nl(number lines)指令便派上用場了。它不僅能為文件每一行加上行號,還能提供多種格式化選項,讓輸出結果更加清晰易讀。
本文将深入解析 nl 指令的強大功能,並透過實際範例展示如何在 Ubuntu 22.04 或 Debian 12 系統中高效使用它。
nl 指令的基本概念
nl 是 Linux 核心工具包的一部分,主要功能是將輸入的文本每一行加上行號後輸出。與 cat -n 類似,但 nl 提供了更豐富的格式化選項,適合需要精確控制輸出樣式的場景。
基本語法如下:
nl [選項] [檔案...]
如果沒有指定檔案,nl 會從標準輸入(stdin)讀取資料。
常用選項解析
nl 的選項分為數字格式、行號起始值、是否跳過空行等幾類。以下介紹最實用的幾個選項:
- -n format:指定行號的格式。
ln:左對齊,無前導零(Left Justified, no leading zeros)。rn:右對齊,無前導零(Right Justified, no leading zeros)。rz:右對齊,前導零填充(Right Justified, leading zeros)。
- -w width:指定行號欄位的寬度。預設為 6。
- -s separator:指定行號與內容之間的分隔字元。預設為 tab(製表符)。
- -v start:指定起始行號。
- -i increment:指定行號遞增的步長。
- -b body-numbering:控制哪些行需要編號。
a:所有行都編號(預設)。t:僅非空行編號。n:所有行都不編號(類似cat)。
實際操作範例
為了讓讀者能跟著操作,我們先建立一個測試用的文字檔 test.txt。
cat > test.txt << EOF
第一行內容
第二行內容
第四行內容(空行)
第六行內容
EOF
範例一:基本行號顯示
最簡單的用法是直接對檔案進行編號。預設情況下,行號會右對齊,並與內容之間以 tab 隔開。
nl test.txt
輸出結果:
1 第一行內容
2 第二行內容
3
4 第四行內容(空行)
5 第六行內容
注意:預設情況下,空行(第 3 行)也會被編號。
範例二:左對齊與自訂分隔符
有時行號過長會影響閱讀,或者我們希望行號靠左對齊以節省螢幕空間,可以使用 -n ln 選項。同時,使用 -s : 將分隔符改為冒號,使結構更清晰。
nl -n ln -s : test.txt
輸出結果:
1:第一行內容
2:第二行內容
3:
4:第四行內容(空行)
5:第六行內容
這種格式非常適合嵌入到程式碼註解或簡報中,因為它佔用的水平空間較少。
範例三:跳過空行編號
在程式碼或配置文件中,空行通常只是為了可讀性,不需要計算在邏輯行數中。使用 -b t 選項可以忽略空行。
nl -b t test.txt
輸出結果:
1 第一行內容
2 第二行內容
3 第四行內容(空行)
4 第六行內容
觀察第 2 行與第 3 行之間有一個空行,但行號從 2 直接跳到 3,沒有為空行分配號碼。這對於檢查程式碼行數特別有用。
範例四:自訂起始值與步長
假設你正在編輯一個已經有行號的腳本,或者需要將多段文字合併並保持連續的行號,可以使用 -v 和 -i 選項。
# 從第 10 行開始,每次增加 2
nl -v 10 -i 2 test.txt
輸出結果:
10 第一行內容
12 第二行內容
14
16 第四行內容(空行)
18 第六行內容
這個功能在處理大型日誌檔分段分析時非常實用。
常見問題與注意事項
1. nl 與 cat -n 有什麼不同?
很多使用者習慣使用 cat -n 來查看行號,兩者看似功能相同,但 nl 更強大。cat -n 僅提供基本的右對齊行號,且無法靈活調整格式。nl 支援左對齊、前導零、自訂分隔符、跳過空行等高級選項。此外,nl 可以處理多個檔案輸入,並為每個檔案獨立編號(使用 -s 選項配合檔案名),而 cat -n 則會連續編號。
2. 為什麼行號與內容之間有空格?
預設情況下,nl 使用 tab 字元作為分隔符。在某些終端機環境中,tab 可能被擴展為多個空格,導致對齊看起來不整齊。如果你希望精確控制間距,可以使用 -w 選項調整行號欄位寬度,並使用 -s 指定單一空格或其他字元。例如:nl -w 5 -s ' ' 會產生固定寬度的行號,並用單一空格分隔。
小結
nl 是一個被低估但極具實用的 Linux 指令。透過靈活運用其選項,你可以輕鬆地為任何文本文件加上清晰、格式化的行號,無論是進行程式碼審查、日誌分析還是數據整理,都能大幅提升工作效率。建議在處理多行文本時,多嘗試 -b t(跳過空行)和 -n ln(左對齊)這兩個選項,它們在實際工作中最為頻繁使用。