Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學

Linux I/O 重定向與文本處理三劍客 (grep/sed/awk) 進階實戰

編輯:Linux 系統常見問題解答

重定向核心概念

文件描述符 (FD):0=stdin、1=stdout、2=stderr。重定向本質是修改進程 FD 表指向。

cmd 1> out.txt    # 標準輸出覆蓋cmd 2> err.txt    # 錯誤輸出覆蓋cmd &> all.txt    # 合併輸出 (bash)cmd 1>> out.txt   # 追加模式cmd 2>> err.txt   # 錯誤追加cmd 2>&1         # stderr 複製到 stdout (順序敏感!)cmd > all.txt 2>&1  # 正確合併寫入文件cmd > all.txt 2>&1  # 等價 &> (bash)

關鍵順序:cmd > file 2>&1 ≠ cmd 2>&1 > file (後者 stderr 仍指向終端)。

grep 正則搜索進階

grep -i "error" log.txt          # 忽略大小寫grep -n "pattern" file           # 顯示行號grep -v "exclude" file           # 反選grep -A 3 -B 2 "keyword" file    # 後 3 行 / 前 2 行上下文grep -E "cat|dog" file           # 擴展正則 ORgrep -P "(\d{3}-)\d{4}" file    # Perl 正則 (PCRE)grep -r "TODO" src/              # 遞歸目錄grep -l "pattern" *.c             # 僅列出匹配文件名grep -c "pattern" file             # 計數匹配行數

sed 流編輯器實戰

# 基本替換sed 's/old/new/' file        # 每行首次匹配替換sed 's/old/new/g' file       # 全局替換sed 's/old/new/2' file       # 僅第 2 次匹配# 定界符可換:sed 's@/usr@/opt@g'# 地址範圍sed '10,20s/old/new/g' file  # 第 10-20 行sed '/start/,/end/s/old/new/g' # 模式範圍# 刪除/打印sed '3d' file                # 刪除第 3 行sed '/^$/d' file              # 刪除空行sed -n '5,10p' file          # 僅打印 5-10 行 (-n 抑制默認輸出)# 多命令sed -e 's/a/b/' -e 's/c/d/' filesed -f script.sed file         # 從文件讀取命令# 原地修改sed -i 's/old/new/g' file    # 直接修改文件 (備份: -i.bak)

awk 欄位處理與報表

# 默認分隔符空白字符awk '{print $1,$NF}' file      # 首尾欄位awk -F: '{print $1,$3}' /etc/passwd  # 指定分隔符# 內建變量: NR(行號) NF(欄位數) FS(輸入分隔符) OFS(輸出分隔符)awk 'NR>1 && $3>1000 {sum+=$3} END {print "Total:", sum}' data.csv# 條件塊awk '/error/ {print FILENAME":"NR":"$0}' *.log# 關聯數組統計awk '{count[$1]++} END {for (ip in count) print ip, count[ip]}' access.log

組合拳實戰

# 統計訪問 IP 前 10awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -10# 提取錯誤日志上下文並保存grep -B2 -A5 "ERROR" app.log | tee error_context.txt# CSV 轉 JSON (簡易)awk -F, 'NR==1 {for(i=1;i<=NF;i++) h[i]=$i; next} {printf "{%s}", $0}' data.csv

性能提示

  • 大文件優先 grep -a (二進制視為文本) 或 rg (ripgrep) / ag (silversearcher)。
  • sed/awk 單次讀取流式處理,內存常數級;避免 cat file | sed 多進程開銷,直接 sed file。
  • 複雜邏輯考慮 Python/Go 腳本,可維護性更強。
Copyright © Windows教程網 All Rights Reserved