在 Linux 系統管理與腳本開發中,grep、sed、awk 是處理文字資料的核心工具。本文系統整理三者的常用參數、語法與實戰範例,助你快速上手。
使用正則表達式搜尋文本,輸出匹配行。全稱 Global Regular Expression Print。
| 參數 | 說明 |
|---|---|
-n | 顯示行號 |
-v | 反向匹配(顯示不包含的行) |
-i | 忽略大小寫 |
-l | 僅列出檔案名 |
-E | 使用擴展正則表達式 |
-w | 全字匹配 |
# 在檔案中搜尋 error,顯示行號 grep -n "error" /var/log/syslog # 遞迴搜尋目錄下所有 .conf 檔案包含 port 80 的行 grep -r "port 80" /etc/*.conf
針對整行進行編輯(刪除、新增、替換、列印),適合批次修改檔案。
| 選項 | 說明 |
|---|---|
-n | 靜默模式,僅輸出經處理的行 |
-f script | 從檔案讀取編輯指令 |
-i | 直接修改原檔案(慎用) |
| 動作 | 說明 |
|---|---|
a\\text | 在匹配行之後新增行 |
c\\text | 取代匹配行 |
d | 刪除匹配行 |
i\\text | 在匹配行之前插入行 |
p | 列印匹配行(常搭配 -n) |
s/old/new/g | 全域替換 |
# 將檔案中所有 http 替換為 https,直接修改檔案 sed -i 's/http:/https:/g' config.txt # 刪除第 10 到 20 行 sed -i '10,20d' file.txt # 只列印包含 error 的行 sed -n '/error/p' log.txt
可作為程式語言使用,擅長欄位切割、格式化輸出、統計運算。
FS / -F:輸入欄位分隔符OFS:輸出欄位分隔符NR:目前記錄號(行號)$1, $2...:第 1、2... 個欄位$0:整行內容cat -n /etc/passwd | awk -F ":" '{print $1 "\t" $3 "\t" $4}'
cat /etc/passwd | awk '
BEGIN {FS=":"; printf "%-5s %-15s %-10s %-10s\n", NR, "username", "userid", "groupid"}
{printf "%-5s %-15s %-10s %-10s\n", NR, $1, $3, $4}
END {print "finish"}'
ll | awk '$2 > 5 {print $0}'
cat score.txt | awk '
BEGIN {FS="|"; print "MY Score List"}
NR==1 {print $0 "Sum" FS "Average" FS}
NR>1 {sum=$2+$3+$4+$5+$6; avg=sum/5; print $0 sum FS avg FS}
END {print "Finish"}'
輸出:
MY Score List |Math|English|C++|OS|SE|Sum|Average| |95 |89 |92 |98|99|374|74.8| |66 |78 |82 |81|90|307|61.4| |79 |65 |77 |82|35|303|60.6| Finish
三者常搭配管線(|)使用,例如 grep "error" log.txt | awk '{print $1}',發揮最大效能。