Linux 三劍客之 sed:90% 的人只會(huì)替換文本,你錯(cuò)過(guò)了多少神技?
前言:改個(gè)文件還得手動(dòng)?試試 sed,一秒搞定!
大家好,我是小康。
還在手動(dòng)修改配置文件?日志分析時(shí)翻半天找關(guān)鍵詞?批量替換文本還得一個(gè)個(gè)點(diǎn)開改?
別折騰了!今天就帶你認(rèn)識(shí) Linux 里的“文本處理神器”——sed,讓你用一行命令,批量修改、刪除、替換文本內(nèi)容,輕松搞定以前要手動(dòng)改半天的事!
用 sed 能干什么?
- 批量修改文本 ?? 比如,把 hello 全部改成 hi
- 刪除特定行 ?? 比如,刪掉文件里的第 10 行
- 提取特定內(nèi)容 ?? 比如,只顯示文件里的第 5 到 10 行
- 日志分析 ?? 過(guò)濾掉無(wú)關(guān)信息,只顯示你關(guān)心的部分
sed 很強(qiáng)大,很多 Linux 高手天天都在用,但很多人還不知道它的威力。今天,我們就來(lái)聊聊 sed,只講 最常用的命令,不搞復(fù)雜難懂的東西,讓你 看完就能用,學(xué)完就能上手!
一、sed 是什么?為什么你一定要學(xué)會(huì)它?
sed 簡(jiǎn)單介紹
sed,全稱 Stream Editor(流編輯器),它的核心思想是:
不打開文件,直接在命令行中修改、刪除、替換文本,并且可以把修改后的結(jié)果輸出到終端或保存到文件。
換句話說(shuō),它不像 vim、nano 那樣需要手動(dòng)編輯文件,而是 自動(dòng)化處理文本,適合處理日志、批量修改文件、數(shù)據(jù)提取等場(chǎng)景。
基礎(chǔ)用法:
sed '指令' 文件
這個(gè) 指令 就是告訴 sed 你想干嘛,比如 替換、刪除、顯示某些行。
二、sed 最常用的 6 個(gè)操作
光講概念沒意思,直接上實(shí)戰(zhàn),不看廢話,看完就會(huì)!
1. 替換文本(相當(dāng)于 Ctrl+H)
用法:
sed 's/舊內(nèi)容/新內(nèi)容/' 文件名
- s:表示 substitute(替換)
- /舊內(nèi)容/新內(nèi)容/:表示 將“舊內(nèi)容”替換成“新內(nèi)容”
?? 示例:把 hello 替換成 hi
echo "hello world" | sed 's/hello/hi/'
輸出:
hi world
在文件里替換:
假設(shè) file.txt 里有:
hello Alice,hello Alice's sister
hello Bob, hello Bob's brother
hello Charlie
執(zhí)行:
sed 's/hello/hi/' file.txt
輸出:
hi Alice,hello Alice's sister
hi Bob, hello Bob's brother
hi Charlie
- 這里只是打印出修改后的結(jié)果,但不會(huì)真正修改 file.txt 的內(nèi)容。
- 你只是看到終端里 hello 被替換成了 hi,但 file.txt本身沒有發(fā)生任何變化。
你可以用 cat file.txt 再看一遍文件內(nèi)容,會(huì)發(fā)現(xiàn)它還是原來(lái)的樣子。
問(wèn)題:怎么只替換了每一行第一個(gè)出現(xiàn)的 hello?怎么全部替換 ?如果我想改文件,又該怎么做? ?? ,繼續(xù)往下看。
2. 全局替換(所有匹配項(xiàng)都替換)
默認(rèn)情況下,sed只替換每一行的第一個(gè)匹配項(xiàng),如果想替換所有,要加 g(global):
sed 's/hello/hi/g' file.txt
輸出:
hi Alice,hi Alice's sister
hi Bob, hi Bob's brother
hi Charlie
記住 g,否則只會(huì)替換每行的第一個(gè)匹配項(xiàng)!
3. 直接修改文件
默認(rèn) sed 不會(huì)改動(dòng)原文件,只是把修改結(jié)果輸出到終端。如果想真正改文件,需要加 -i:
sed -i 's/hello/hi/g' file.txt
注意:
- -i直接修改文件,沒有撤銷功能,誤操作可能會(huì)導(dǎo)致數(shù)據(jù)丟失!
- 建議先使用 cat file.txt 看看內(nèi)容,確保不會(huì)誤改重要文件。
更安全的方式:先備份文件,再修改!
為了避免誤操作導(dǎo)致數(shù)據(jù)丟失,推薦使用 -i.bak先創(chuàng)建文件備份,然后再修改:
sed -i.bak 's/hello/hi/g' file.txt
執(zhí)行后,系統(tǒng)會(huì):
- 修改 file.txt,將 hello 替換成 hi。
- 自動(dòng)創(chuàng)建 file.txt.bak 備份文件(修改前的內(nèi)容)。
示例:
假設(shè) file.txt 內(nèi)容如下:
hello world
hello Linux
hello sed
執(zhí)行:
sed -i.bak 's/hello/hi/g' file.txt
執(zhí)行后:
- file.txt 被修改:
hi world
hi Linux
hi sed
- file.txt.bak 是原始文件的備份(未修改的內(nèi)容):
hello world
hello Linux
hello sed
如何恢復(fù)原文件?
如果修改后發(fā)現(xiàn)有問(wèn)題,可以隨時(shí)恢復(fù):
mv file.txt.bak file.txt
這樣,file.txt 就會(huì)恢復(fù)成修改前的版本!
4. 刪除某一行
語(yǔ)法:
sed 'Nd' 文件名
- N 代表 行號(hào)
- d 代表 刪除
?? 示例:刪除第 2 行
假設(shè) file.txt 內(nèi)容:
Peter
Alice
Bob
Charlie
Bob
David
執(zhí)行:
sed '2d' file.txt
輸出:
Peter
Bob
Charlie
Bob
David
?? 刪除最后一行
sed '$d' file.txt
輸出:
Peter
Bob
Charlie
Bob
$ : 代表最后一行
?? 刪除所有包含 Bob 的行
sed '/Bob/d' file.txt
? 輸出
Peter
Charlie
/內(nèi)容/d 就是按內(nèi)容刪除,N d 就是按行號(hào)刪除!
?? 刪除所有空行
sed '/^$/d' file.txt
^$ 代表空行,所以這條命令能刪掉所有空白行!
?? 刪除前 N 行
語(yǔ)法:
sed '1,5d' file.txt
- 1,5d:刪除從第 1 行到第 5 行
- 最終效果:刪除前 5 行,只保留第 6 行之后的內(nèi)容
適用于清理文件頭部信息,刪除表頭或無(wú)用數(shù)據(jù)。
?? 刪除第 N 行到最后一行
語(yǔ)法:
sed '2,$d' file.txt
- 2,$ :表示從第 2 行到最后一行
- d:表示刪除
最終效果:只保留第一行,刪除后面所有內(nèi)容
?? 刪除包含多個(gè)關(guān)鍵詞的行
語(yǔ)法:
sed '/error\|fail/d' file.txt
- /error\|fail/ : 匹配 error 或 fail
- d :刪除匹配的行
最終效果:刪除所有包含 "error" 或 "fail" 的行
示例
假設(shè) file.txt 里有:
process completed successfully.
error: Cannot find file.
warning: Low memory.
fail: Connection lost.
system running normally.
執(zhí)行:
sed '/error\|fail/d' file.txt
輸出:
process completed successfully.
warning: Low memory.
system running normally.
適用于日志分析、錯(cuò)誤排查,快速過(guò)濾無(wú)用日志。
?? 刪除所有以字母開頭的行
語(yǔ)法
sed '/^[a-zA-Z]/d' file.txt
- ^ :匹配行首
- [a-zA-Z] : 匹配任何字母
- d : 刪除匹配的行
最終效果:刪除所有以字母開頭的行
?? 示例
假設(shè) file.txt 里有:
yaml
Alice
12345
Bob
7890
Charlie
執(zhí)行:
sed '/^[a-zA-Z]/d' file.txt
輸出::
12345
7890
適用于日志清理、去除無(wú)用數(shù)據(jù)、提取數(shù)值信息。
5. 只顯示某些行
語(yǔ)法:
sed -n 'Np' 文件名
- N 代表 行號(hào)
- p 代表 打印
?? 示例:打印第 2 行
假設(shè) file.txt 內(nèi)容:
Peter
Alice
Bob
Charlie
Bob
David
執(zhí)行:
sed -n '2p' file.txt
輸出:
Alice
只顯示匹配內(nèi)容,不輸出其他內(nèi)容,可以加 -n。
?? 顯示 2-4 行
sed -n '2,4p' file.txt
輸出:
Alice
Bob
Charlie
適用于日志分析、查看部分?jǐn)?shù)據(jù)!
?? 只顯示匹配的行
如果你想找出所有包含 Bob 的行:
sed -n '/Bob/p' file.txt
-n 選項(xiàng)的作用是 關(guān)閉默認(rèn)輸出,只顯示 p(print)匹配的內(nèi)容。
6. 在指定行前/后插入文本
假設(shè) file.txt 內(nèi)容:
Peter
Alice
Bob
Charlie
?? 在第 2 行前插入 "Henry is comming"
sed '2i\ Henry is comming' file.txt
輸出:
Peter
Henry is coming
Alice
Bob
Charlie
"Henry is coming" 被插入到 第 2 行前面,所以 Alice 變成了第 3 行。
?? 在第 3 行后插入 "David is comming"
sed '3a\ David is comming' file.txt
輸出:
Peter
Henry is coming
Alice
David is comming
Bob
Charlie
i 代表 insert,在某行前插入內(nèi)容;a 代表 append,在某行后追加內(nèi)容。
三、sed 其他常見操作
?? 修改某一行
語(yǔ)法:
sed '3c\ This is a new line' file.txt
- 3c\ :表示修改第 3 行
- "This is a new line" : 替換的新內(nèi)容
最終效果:第 3 行的內(nèi)容會(huì)被 "This is a new line" 替換
示例:
假設(shè) file.txt 里有:
Alice
Bob
Charlie
David
Eve
執(zhí)行:
sed '3c\ This is a new line' file.txt
輸出:
Alice
Bob
This is a new line
David
Eve
c\ 命令用于修改某一行的內(nèi)容,適用于日志清理、格式調(diào)整。
?? 提取包含數(shù)字的行
語(yǔ)法:
sed -n '/[0-9]/p' file.txt
- -n :只顯示匹配的行
- [0-9] :匹配數(shù)字
- p :打印匹配的行
最終效果:只顯示包含數(shù)字的行,忽略其他行
?? 示例
假設(shè) file.txt 里有:
Alice
Bob
12345
Charlie
7890
David
執(zhí)行:
sed -n '/[0-9]/p' file.txt
輸出:
12345
7890
適用于日志分析、數(shù)據(jù)提取、過(guò)濾出數(shù)值行。
?? 刪除空格(去除所有行首和行尾空格)
語(yǔ)法:
sed 's/^[ \t]*//;s/[ \t]*$//' file.txt
- ^[ \t]*// : 刪除行首的空格和 Tab
- [ \t]*$// : 刪除行尾的空格和 Tab
最終效果:去除行首和行尾的空格
?? 示例
假設(shè) file.txt 里有:
Alice
Bob
Charlie
David
執(zhí)行:
sed 's/^[ \t]*//;s/[ \t]*$//' file.txt
輸出:
nginx
Alice
Bob
Charlie
David
適用于格式化文本、清理無(wú)用空格,讓文件更整潔!
?? 刪除 HTML 標(biāo)簽
語(yǔ)法:
sed 's/<[^>]*>//g' file.html
- <[^>]*> : 匹配 HTML 標(biāo)簽
- s/...//g : 替換為空
最終效果:去掉 HTML 標(biāo)簽,只保留純文本
?? 示例
假設(shè) file.html 里有:
<h1>Hello</h1>
<p>Welcome to <b>Linux</b> commands!</p>
執(zhí)行:
sed 's/<[^>]*>//g' file.html
輸出:
Hello
Welcome to Linux commands!
適用于網(wǎng)頁(yè)數(shù)據(jù)提取、去除 HTML 代碼,保留文本內(nèi)容。
?? 刪除注釋(# 或 // 開頭的行)
語(yǔ)法:
sed '/^#/d' config.txt # 刪除 # 開頭的注釋
sed '/^\/\//d' code.cpp # 刪除 // 開頭的注釋
- ^# : 匹配 # 開頭的行
- ^// : 匹配 // 開頭的行
- d : 刪除匹配的行
最終效果:刪除配置文件或代碼中的注釋
?? 示例
假設(shè) config.txt 里有:
# This is a comment
server_port=8080
# Another comment
server_name=localhost
執(zhí)行:
sed '/^#/d' config.txt
輸出:
server_port=8080
server_name=localhost
適用于去除無(wú)用注釋,讓配置文件更加簡(jiǎn)潔清晰!
??sed -e 命令的使用
-e 選項(xiàng)的作用是在同一條 sed 命令中執(zhí)行多個(gè)操作,可以替換、刪除、插入等多種操作同時(shí)進(jìn)行。
sed -e 基礎(chǔ)用法:
sed -e '操作1' -e '操作2' 文件
作用:按順序執(zhí)行多個(gè) sed 操作。
1. 依次執(zhí)行多個(gè)替換
示例:
sed -e 's/Alice/Jane/' -e 's/Bob/John/' file.txt
作用:
- 替換 "Alice" 為 "Jane"
- 替換 "Bob" 為 "John"
?? 示例
文件 file.txt
Alice is a student.
Bob is a teacher.
執(zhí)行命令:
sed -e 's/Alice/Jane/' -e 's/Bob/John/' file.txt
輸出:
Jane is a student.
John is a teacher.
多個(gè) -e 選項(xiàng)可以讓 sed 依次執(zhí)行多個(gè)替換操作!
2. 依次執(zhí)行“刪除 + 替換”
示例:
sed -e '/^#/d' -e 's/error/ERROR/g' file.txt
作用:
- 刪除 # 開頭的注釋行
- 將 error 替換成 ERROR
?? 示例
文件 file.txt:
# This is a comment
Server is running
error: file not found
# Another comment
執(zhí)行命令:
sed -e '/^#/d' -e 's/error/ERROR/g' file.txt
輸出:
Server is running
ERROR: file not found
適用于日志清理,先刪除注釋,再格式化錯(cuò)誤信息!
3. 結(jié)合 -e 實(shí)現(xiàn)多行插入
示例:
sed -e '2i\ --- Start ---' -e '4a\ --- End ---' file.txt
作用:
- 在第 2 行前插入 --- Start ---
- 在第 4 行后插入 --- End ---
?? 示例
文件 file.txt:
Line1
Line2
Line3
Line4
Line5
執(zhí)行命令:
sed -e '2i\ --- Start ---' -e '4a\ --- End ---' file.txt
輸出:
Line1
--- Start ---
Line2
Line3
Line4
--- End ---
Line5
適用于文本標(biāo)記、自動(dòng)化修改文件!
4. -e 結(jié)合 -i 直接修改文件
示例:
sed -i -e 's/foo/bar/g' -e 's/old/new/g' file.txt
作用:
- 將 foo 替換為 bar
- 將 old 替換為 new
- 直接修改 file.txt,而不是只輸出到終端!
-i 讓 sed 直接修改文件內(nèi)容,而不是只顯示修改后的文本!
5. -e 結(jié)合 -n 只顯示匹配的結(jié)果
示例:
sed -n -e '/error/p' -e '/fail/p' file.txt
作用:
- 僅打印包含 "error" 或 "fail" 的行
- 忽略其他行的輸出(-n)
適用于日志分析,快速提取重要信息!
四、sed 結(jié)合 find、grep、awk 等常見組合命令
在實(shí)際工作中,sed 通常不會(huì)單獨(dú)使用,而是和 find、grep、awk、xargs、tee 等命令組合,形成更強(qiáng)大的文本處理工具鏈,適用于 批量修改文件、日志分析、數(shù)據(jù)處理 等場(chǎng)景。??
1. sed + find:批量修改多個(gè)文件
場(chǎng)景:批量替換某個(gè)目錄下所有 .txt 文件中的 hello為 hi
find /path -type f -name "*.txt" -exec sed -i 's/hello/hi/g' {} +
作用:
- find /path -type f -name "*.txt" : 查找 /path 目錄下所有 .txt 文件
- -exec sed -i 's/hello/hi/g' {} + : 在所有找到的文件里替換 hello 為 hi
- + : 批量執(zhí)行,提高效率(比 \; 更快)
示例 : 假設(shè) /path 目錄下有:
file1.txt (包含 "hello world")
file2.txt (包含 "hello Alice")
執(zhí)行后:
file1.txt -> "hi world"
file2.txt -> "hi Alice"
適用場(chǎng)景:
- 批量修改配置文件
- 處理大量日志文件
- 自動(dòng)化代碼修改
2. sed + grep:只修改包含特定內(nèi)容的行
場(chǎng)景:只修改包含 "error" 的行,把 "failed" 替換為 "FAILED"
grep "error" file.txt | sed 's/failed/FAILED/g'
作用:
- grep "error" file.txt : 先篩選 出包含 "error" 的行
- sed 's/failed/FAILED/g' : 只修改這些行 中的 "failed"
示例 : 原 file.txt
Task 1: success
Task 2: error, operation failed
Task 3: success
Task 4: error, connection failed
執(zhí)行:
grep "error" file.txt | sed 's/failed/FAILED/g'
輸出:
Task 2: error, operation FAILED
Task 4: error, connection FAILED
適用場(chǎng)景:
- 過(guò)濾日志文件,并修改某些內(nèi)容
- 只修改特定關(guān)鍵字所在的行
- 避免誤修改不相關(guān)的行
3. sed + awk:精準(zhǔn)修改特定列
場(chǎng)景:批量修改 CSV 文件的第 2 列,把 low 改成 LOW
awk -F, '{ $2=gensub(/low/, "LOW", "g", $2); print }' OFS=, file.csv
作用:
- -F, : 以逗號(hào)分隔
- gensub(/low/, "LOW", "g", $2) : 只替換第 2 列的 low
- OFS=, : 保持逗號(hào)分隔格式
- 最終:只修改第 2 列,保留其他列不變
示例 :原 file.csv
ID,Status,Score
1,low,50
2,medium,70
3,low,40
4,high,90
執(zhí)行:
awk -F, '{ $2=gensub(/low/, "LOW", "g", $2); print }' OFS=, file.csv
輸出:
ID,Status,Score
1,LOW,50
2,medium,70
3,LOW,40
4,high,90
適用場(chǎng)景:
- 精確修改某一列的內(nèi)容,不影響其他列
- 適用于 CSV、TSV、日志文件
- 比 sed 更精準(zhǔn),sed 只能針對(duì)整行替換,而 awk 能操作特定字段
4. sed + xargs:批量修改多個(gè)文件
場(chǎng)景:在多個(gè) .log 文件里批量替換 "DEBUG" 為 "INFO"
find /var/log -type f -name "*.log" | xargs sed -i 's/DEBUG/INFO/g'
作用:
- find /var/log -type f -name "*.log" : 查找所有 .log 文件
- xargs sed -i 's/DEBUG/INFO/g' : 批量替換,不會(huì)逐個(gè)執(zhí)行(比 -exec 更快)
適用場(chǎng)景:
- 高效處理海量文件(比 find -exec 更快)
- 避免 Too many arguments 錯(cuò)誤(當(dāng)文件太多時(shí),xargs 會(huì)批量處理)
5. sed + tee:邊修改邊輸出
場(chǎng)景:把 config.conf 里的 "8080" 端口改成 "9090",同時(shí)保存到 new_config.conf
sed 's/8080/9090/g' config.conf | tee new_config.conf
作用:
- sed 's/8080/9090/g' config.conf : 修改端口
- tee new_config.conf : 同時(shí)輸出到終端和 new_config.conf
適用場(chǎng)景:
- 保留原始文件,不直接修改
- 先檢查輸出,確保無(wú)誤再用 -i 修改
6. sed + diff:對(duì)比修改前后的差異
場(chǎng)景:我們有一個(gè) file.txt,其中包含 "error",想用 sed 把它改成 "ERROR",但在真正修改前,先用 diff 對(duì)比 修改前后的差異,確保不會(huì)誤改。
示例
file.txt 內(nèi)容:
Task 1: success
Task 2: error, operation failed
Task 3: success
Task 4: error, connection lost
(1) 用 sed 預(yù)覽修改
sed 's/error/ERROR/g' file.txt
預(yù)期輸出:
Task 1: success
Task 2: ERROR, operation failed
Task 3: success
Task 4: ERROR, connection lost
(2) 用 diff 對(duì)比修改前后
diff <(cat file.txt) <(sed 's/error/ERROR/g' file.txt)
輸出:
2c2
< Task 2: error, operation failed
---
> Task 2: ERROR, operation failed
4c4
< Task 4: error, connection lost
---
> Task 4: ERROR, connection lost
解釋:
- 2c2 : 第 2 行變化:
< Task 2: error, operation failed # 舊內(nèi)容
---
> Task 2: ERROR, operation failed # 新內(nèi)容
- 4c4 : 第 4 行也有類似的變化。
(3) 確認(rèn)無(wú)誤后,正式修改文件
sed -i 's/error/ERROR/g' file.txt
-i 直接修改 file.txt,不用手動(dòng)保存
適用場(chǎng)景:
- 檢查 sed 修改的影響,避免誤改
- 對(duì)比文件修改前后的版本,避免數(shù)據(jù)丟失
- 適用于日志分析、代碼改動(dòng)、批量文本處理
sed + diff 讓你在修改前先檢查變化,確保修改準(zhǔn)確無(wú)誤,數(shù)據(jù)安全性更高!
五、總結(jié):掌握 sed,讓文本處理更高效!
sed 是 Linux 中強(qiáng)大的文本處理工具,它不僅能 查找、替換、刪除、插入文本,還能結(jié)合 find、grep、awk、xargs 等命令,實(shí)現(xiàn)批量修改和自動(dòng)化處理。無(wú)論是 日志分析、批量修改配置文件、處理文本數(shù)據(jù),sed 都能幫你 減少重復(fù)勞動(dòng),大幅提升工作效率。
學(xué)完這篇文章,你應(yīng)該掌握了這些核心操作:
基礎(chǔ)操作:
- 通過(guò) s/old/new/g 實(shí)現(xiàn) 文本替換(相當(dāng)于 Ctrl+H)。
- 用 -i 選項(xiàng) 直接修改文件,無(wú)需手動(dòng)打開編輯。
- 刪除某行(按行號(hào)刪除、按匹配模式刪除)。
- 顯示或提取特定內(nèi)容(比如第 10 行、包含某個(gè)關(guān)鍵字的行)。
- 在指定行前/后插入文本,適用于配置文件修改。
進(jìn)階技巧:
- 結(jié)合 find,批量修改多個(gè)文件,不再逐個(gè)手動(dòng)編輯。
- 結(jié)合 grep,只修改包含特定內(nèi)容的行,提高精準(zhǔn)度。
- 結(jié)合 awk,針對(duì)特定列進(jìn)行修改,處理 CSV、日志等結(jié)構(gòu)化數(shù)據(jù)。
- 結(jié)合 xargs,高效處理多個(gè)文件,節(jié)省時(shí)間。
- 結(jié)合 tee,邊修改邊輸出,適用于調(diào)試和日志處理。
適用場(chǎng)景:
- 批量修改代碼或配置文件,比如 替換端口號(hào)、修改日志級(jí)別、更新 URL 等。
- 清理和格式化日志,如 刪除多余信息、提取 IP 地址、去除 HTML 標(biāo)簽或注釋。
- 數(shù)據(jù)分析和處理,用于 提取特定字段、格式化文本數(shù)據(jù),與 awk 結(jié)合使用更加強(qiáng)大。
學(xué)會(huì) sed,你就能輕松修改文件,不再手動(dòng)改一堆文本!
進(jìn)一步學(xué)習(xí):學(xué)完 sed,下一步該學(xué)什么?
恭喜你!現(xiàn)在你已經(jīng)掌握了 sed 的核心用法,并且知道如何 高效查找、替換、刪除、插入文本,大幅提高了處理文本的效率。但在 Linux 文本處理的世界里,sed 只是 第一塊拼圖,還有一個(gè)更加強(qiáng)大的工具——awk!
sed 主要用于修改和處理文本,而 awk 更適合分析和提取數(shù)據(jù),比如:
- 提取 CSV 文件中的某一列數(shù)據(jù)。
- 計(jì)算日志中某個(gè)關(guān)鍵詞出現(xiàn)的次數(shù)。
- 統(tǒng)計(jì)服務(wù)器訪問(wèn)日志中,每個(gè) IP 的請(qǐng)求次數(shù)。
- 對(duì)文本數(shù)據(jù)進(jìn)行篩選、計(jì)算、分組統(tǒng)計(jì)等操作。
如果 sed 是“文本編輯器”,那 awk 就是“文本計(jì)算器”!