在 Linux 系統管理與腳本開發中,精確擷取檔案特定行範圍是高頻需求。本文介紹四種主流方法:sed、awk、head/tail 組合、以及 nl 搭配 grep,並對比效能與適用場景,助你根據檔案大小與任務複雜度選擇最佳工具。



# 語法:sed -n '起始行,結束行p' 檔案
sed -n '10,20p' logfile.txt # 顯示第 10-20 行
sed -n '5,100p' logfile.txt # 顯示第 5-100 行
sed -n '1,5p' logfile.txt # 顯示前 5 行(等同 head -5)
sed -n '$p' logfile.txt # 顯示最後一行(等同 tail -1)
sed -n '10,$p' logfile.txt # 顯示第 10 行到檔案結尾
關鍵參數:-n抑制預設輸出,p列印匹配行。若省略-n會輸出整個檔案並重複列印目標行。
# 顯示第 10-20 行
awk 'NR>=10 && NR<=20' logfile.txt
# 顯示特定行(如第 5、10、15 行)
awk 'NR==5 || NR==10 || NR==15' logfile.txt
# 結合條件:第 10 行之後且包含 "error"
awk 'NR>10 && /error/' logfile.txt
# 顯示行號與內容
awk '{print NR ": " $0}' logfile.txt | sed -n '10,20p'
# 顯示第 100-200 行:先取前 200 行,再取後 101 行
head -200 logfile.txt | tail -101
# 通用公式:顯示第 M 到 N 行 (M<=N)
# head -N | tail -$(N-M+1)
head -200 logfile.txt | tail -$((200-100+1))
# 顯示倒數第 50 到 20 行
tail -50 logfile.txt | head -31
效能優勢:head/tail僅讀取必要區塊,對 GB 級大檔案極快;sed/awk需掃描前置行數。
# 先加行號再篩選
nl -ba logfile.txt | grep -E '^(1[0-9]|20)\s'
# 或使用 cat -n
cat -n logfile.txt | sed -n '10,20p'
| 需求 | 推薦指令 | 範例 |
|---|---|---|
| 顯示第 N 行單行 | sed -n 'Np' | sed -n '42p' file |
| 顯示倒數 N 行 | tail -N | tail -20 file |
| 排除前 N 行 | tail -n +$(N+1) | tail -n +11 file (跳過前10行) |
| 多個不連續區間 | sed -n -e '5,10p' -e '20,25p' | sed -n -e '5,10p' -e '20,25p' file |
| 配合正則表達式行首 | awk '/^ERROR/ && NR>100' | 第100行後以ERROR開頭的行 |
sed 語法最直觀,功能最豐富head/tail 組合或 awk 避免全檔掃描awk 程式化能力最強cat -n | less 或 nl | grep熟練掌握這四種方法的組合運用,能讓日誌分析、設定檔審閱、資料擷取等工作事半功倍。建議根據實際檔案大小與任務需求靈活選擇。