文件描述符 (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 -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 '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 '{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。