前幾天面試,被一位面試官嫌棄了“你的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命令的基本使用方法,希望對大家有幫助。