nl 為文件加上行號 文章首圖

nl 為文件加上行號

nl 為文件加上行號

在 Linux 系統管理與程式開發的日常工作中,我們經常需要處理大量的純文字檔、日誌檔(log files)或是腳本程式碼。當文件內容變得龐大且複雜時,快速定位特定段落或行數變得至關重要。雖然 grepless 也能協助搜尋,但它們無法直接提供「相對位置」的概念。這時,nl(number lines)指令便派上用場了。它不僅能為文件每一行加上行號,還能提供多種格式化選項,讓輸出結果更加清晰易讀。

本文将深入解析 nl 指令的強大功能,並透過實際範例展示如何在 Ubuntu 22.04 或 Debian 12 系統中高效使用它。

nl 指令的基本概念

nl 是 Linux 核心工具包的一部分,主要功能是將輸入的文本每一行加上行號後輸出。與 cat -n 類似,但 nl 提供了更豐富的格式化選項,適合需要精確控制輸出樣式的場景。

基本語法如下:

nl [選項] [檔案...]

如果沒有指定檔案,nl 會從標準輸入(stdin)讀取資料。

常用選項解析

nl 的選項分為數字格式、行號起始值、是否跳過空行等幾類。以下介紹最實用的幾個選項:

  1. -n format:指定行號的格式。
    • ln:左對齊,無前導零(Left Justified, no leading zeros)。
    • rn:右對齊,無前導零(Right Justified, no leading zeros)。
    • rz:右對齊,前導零填充(Right Justified, leading zeros)。
  2. -w width:指定行號欄位的寬度。預設為 6。
  3. -s separator:指定行號與內容之間的分隔字元。預設為 tab(製表符)。
  4. -v start:指定起始行號。
  5. -i increment:指定行號遞增的步長。
  6. -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(左對齊)這兩個選項,它們在實際工作中最為頻繁使用。