前幾天面試,被一位面試官嫌棄了“你的Linux命令有點low”。被嫌棄也挺正常的,因為我的簡歷寫的我自己都有點看不下去:了解Linux常用命令,如ls,tail -f等命令,基本滿足日常的開發。面試官人很好,整個面試進行地也很愉快。說心里話,還是挺感激的,因為很少有面試官會指出我的簡歷上出現的問題。所以呢,今天就來聊一聊不low的Linux命令——搜索文件的find命令、搜索文件內容的grep命令、對文件內容進行統計的awk命令、批量替換文件內容的sed命令。
find命令
find簡介
find命令是一個用於搜索文件的命令。find命令的基本語法:find path [option] params
path為搜索文件的路徑,可以是相對路徑,也可以是絕對路徑,還可以指定多個路徑,如:find /var /home。
主要選項(option)如下:
| 選項 | 含義 |
|---|---|
| -depth | 在查看目錄本身之前先搜索目錄的內容 |
| -follow | 跟隨符號鏈接 |
| -maxdepths N | 最多搜索N層目錄 |
| -mount | 不搜索其他文件系統中的目錄 |
主要參數(param)如下:
| 參數 | 含義 |
|---|---|
| -atime N | 文件在N天之前被最后訪問過 |
| -mtime N | 文件在N天之前被最后修改過 |
| -name pattern | 文件名需要匹配pattern |
| -newer otherfile | 文件比其他文件要新 |
| -type c | 文件類型為c,最常見的是d(目錄)和f(普通文件) |
| -user username | 文件的擁有者是username |
| -size +1M | 文件大小。例子為查找文件大小大於1M的。 |
| -perm 644 | 文件權限。例子為查找文件權限為644的。 |
常用方法
- 精確查找文件:
find ~ -name "spur.java"

- 模糊查找:
find ~ -name "spur*"

模糊查找可以找到spur開頭的文件和目錄,那如果要單獨查找目錄或者單獨查找文件怎么辦呢?
其實有個-type可以用來篩選目錄和文件,查找文件在上面的命令后面添加-type f,查找目錄加-type d。
- 忽略文件名大小寫進行查找文件:
find ~ iname "spurt*" - 查找文件並恢復文件權限:
find -type f -exec chmod -R 644 {} \; - 刪除30天之前的日志文件:
find -type f -name "*.log" -mtime +30 -exec rm -rf {} \;
grep命令
grep簡介
grep (縮寫來自Globally search a Regular Expression and Print)是一種強大的文本搜索工具,它能使用特定模式匹配(包括正則表達式)搜索文本,並默認輸出匹配行,基本語法為grep [options] pattern [file]
如果沒有提供文件名,則grep命令將會搜索標准輸入。
主要選項(option)如下表:
| 選項 | 含義 |
|---|---|
| -c | 輸出匹配行的數目 |
| -h | 取消每個輸出行的普通前綴 |
| -i | 忽略大小寫 |
| -l | 查找多個文件,只列出包含匹配行的文件名 |
| -v | 反向查找 |
| -n | 順便輸出行號 |
常用方法
- 在文件中搜索字符串,然后輸出匹配的行。例如匹配文件spur.txt中的字符串for,並輸出整行,要求帶行號:
grep -n for spur.txt

- 計算匹配的行的數目:
grep -c for spur.txt

- 管道操作符“|”可將指令連接起來,前一個指令的輸出作為后一個指令的輸入。注意:只有前一個命令正確輸出的時候,才會處理后一個命令。例如:
find ~ | grep for

- 匹配ip地址:
egrep --color "([0-9]{1,3}\.){3}[0-9]{1,3}$" test.txt
awk命令
awk簡介
AWK是Unix系統下一個非常強大的文本處理工具。AWK其名稱得自於它的創始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首個字母。實際上 AWK 本身也可以作為一門計算機腳本語言。它允許創建簡短的程序,這些程序可以讀取輸入文件、為數據排序、處理數據、對輸入執行計算以及生成報表等其他的功能。
- awk知識要點
- 語法:
awk [options] 'cmd' file - 一次讀取一行文本,按輸入分隔符進行切片,切成多個組成部分(一行為一個record,一列為一個field)
- 將切片直接保存在內建的變量中,$1,$2...($0表示行的全部)
- 支持對單個切片的判斷,支持循環判斷,默認分隔符為空格
- 語法:
常用方法
這里有個spur.txt的文件,文件內容如下:

- 使用awk命令查看全部文件內容:
awk '{print}' spur.txt
print是awk的內置函數,用於打印出變量的值。

- 打印某一列或者某幾列:$1為第1列,$2為第2列,...($0表示全部)
以打印第1列和第4列為例:awk '{print $1,$4}' spur.txt

- 分隔符的使用。
awk認為“,”為系統默認分隔符,“ ”為直接連接起來。

例如第2個例子中awk '{print $1,$4}' spur.txt,使用的是默認分隔符,結果兩列之間有空格隔開的。
本例子使用awk '{print $1 $4}' spur.txt,使用的是直接相連,結果兩列之間沒有空格隔開。
當然,也可以自定義分隔符。如果希望用“-”分割,可以這么寫:awk '{print $1 "-" $4}' spur.txt

- 內置變量NR和NF的使用。
Awk定義一行為一個record,一列為一個field。NR為行數(number of record),NF為列數(number of field)。
例如查找打印最后一列為2794的記錄並打印:awk '$NF==2794{print $0}' spur.txt

- BEGIN語句塊和END語句塊。
BEGIN用於awk 開始處理輸入文件中的文本之前執行初始化代碼。
END用於執行最終計算或打印應該出現在輸出流結尾的摘要信息。
繼續以分隔符舉例,我們可以使用BEGIN語句塊來定義全局變量,FS為輸入分隔符,OFS為輸出分隔符。
提示:如果awk命令后面不加文件名,awk則認為下一行輸入的內容為需要處理的內容。
設置“,”為輸入分隔符,“\t”為輸出分隔符:

- 正則表達式(Regular Expression)的使用。
正則表達式估計大家都比較了解,就不多嘮叨了,下面列出幾個常用的:
| 字符 | 描述 |
|---|---|
| . | 匹配任意一個字符 |
| ^ | 匹配開頭。/^abc/匹配以abc開頭字符串 |
| $ | 匹配結尾。/abc$/匹配以abc結尾的字符串 |
| [abc] | 字符集合。匹配所包含的任意一個字符。 |
| [^a-z] | ^放在方括號里面表示非。[^a-z]匹配不是a-z的字符串 |
| * | 匹配前面的子表達式零次或多次。 |
| + | 匹配前面的子表達式一次或多次。 |
| ? | 匹配前面的子表達式零次或一次。 |
| {n} | 匹配n次。/ab{3}c/匹配b出現3次。 |
| {n,m} | 匹配n-m次。ab{3,10}c匹配b可以出現3次至10次。 |
| {n,} | 至少匹配n次。/ab{3,}c/匹配b出現3次及3次以上。 |
| () | ()看成一個整體。/(ab)+c/:ab作為一個整體,至少出現一次。 |
例如需要匹配出馬刺隊所有的后衛球員,也就是正則匹配spur.txt中包含guard的記錄:awk '/guard/{print $0}' spur.txt

匹配第3列以“te”結尾,打印所有的列:awk '$3 ~ /(te)$/{print $0}' spur.txt

注意:“~”表示模式開始。“//” 中是模式。
這是一道我面試某視頻娛樂公司的面試題,像這種難度的小問題還希望大家多重視。
更多的操作可以參考:Awk官方文檔
sed命令
sed簡介
Sed的全名為Stream Editor,流編輯器,適合用於對文本的行內容進行處理。基本語法為:sed [option] 'sed command' filename
常用的選項:
| 選項 | 含義 |
|---|---|
| -n | 使用安靜模式 |
| -e | 直接在指令列模式上進行 sed 的動作編輯 |
| -f | 直接將 sed 的動作寫在一個檔案內, -f filename 則可以執行 filename 內的sed 動作 |
| -r | 在腳本中使用擴展正則表達式 |
| -i | 直接修改讀取的檔案內容,而不是將修改結果輸出到終端上 |
常用的命令:
| 命令 | 含義 |
|---|---|
| a | 新增行 |
| c | 取代行 |
| d | 刪除行,d 后面通常不加任何字符 |
| i | 插入行 |
| p | 打印 |
| s | 替代 |
常用方法
- 刪除指定的行(刪除1-3行為例):
sed '1,3d' replace.txt - 新增一行:
sed '1a hello world' replace.txt - 替換某行:
sed '1c hello world' replace.txt - 把“Str”開頭的行替換為“String”,僅輸出到終端顯示:
sed 's/^Str/String/' replace.txt - 字符串替換,把
replace.txt中全部的“Jack”替換為“me”,要求在文檔中修改:sed -i 's/Jack/me/g' replace.txt - 替換末尾的“.”為“;”:
sed -i 's/\.$/\;/' replace.java
小結
本文介紹了find命令、grep命令、awk命令、sed命令的基本使用方法,希望對大家有幫助。
