前幾天面試,被一位面試官嫌棄了「你的Linux命令有點low」。被嫌棄也挺正常的,由於個人簡歷寫的我本身都有點看不下去:瞭解Linux經常使用命令,如ls
,tail -f
等命令,基本知足平常的開發。面試官人很好,整個面試進行地也很愉快。說內心話,仍是挺感激的,由於不多有面試官會指出個人簡歷上出現的問題。因此呢,今天就來聊一聊不low的Linux命令——搜索文件的find命令、搜索文件內容的grep命令、對文件內容進行統計的awk命令、批量替換文件內容的sed命令。html
find命令是一個用於搜索文件的命令。find命令的基本語法:find path [option] params
java
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 {} \;
find -type f -name "*.log" -mtime +30 -exec rm -rf {} \;
grep (縮寫來自Globally search a Regular Expression and Print)是一種強大的文本搜索工具,它能使用特定模式匹配(包括正則表達式)搜索文本,並默認輸出匹配行,基本語法爲grep [options] pattern [file]
3d
若是沒有提供文件名,則grep命令將會搜索標準輸入。日誌
主要選項(option)以下表:code
選項 | 含義 |
---|---|
-c | 輸出匹配行的數目 |
-h | 取消每一個輸出行的普通前綴 |
-i | 忽略大小寫 |
-l | 查找多個文件,只列出包含匹配行的文件名 |
-v | 反向查找 |
-n | 順便輸出行號 |
grep -n for spur.txt
grep -c for spur.txt
find ~ | grep for
egrep --color "([0-9]{1,3}\.){3}[0-9]{1,3}$" test.txt
AWK是Unix系統下一個很是強大的文本處理工具。AWK其名稱得自於它的創始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首個字母。實際上 AWK 自己也能夠做爲一門計算機腳本語言。它容許建立簡短的程序,這些程序能夠讀取輸入文件、爲數據排序、處理數據、對輸入執行計算以及生成報表等其餘的功能。
awk [options] 'cmd' file
這裏有個spur.txt的文件,文件內容以下:
awk '{print}' spur.txt
print是awk的內置函數,用於打印出變量的值。
以打印第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
Awk定義一行爲一個record,一列爲一個field。NR爲行數(number of record),NF爲列數(number of field)。
例如查找打印最後一列爲2794的記錄並打印:awk '$NF==2794{print $0}' spur.txt
BEGIN用於awk 開始處理輸入文件中的文本以前執行初始化代碼。
END用於執行最終計算或打印應該出如今輸出流結尾的摘要信息。
繼續以分隔符舉例,咱們可使用BEGIN語句塊來定義全局變量,FS爲輸入分隔符,OFS爲輸出分隔符。
提示:若是awk命令後面不加文件名,awk則認爲下一行輸入的內容爲須要處理的內容。
設置「,」爲輸入分隔符,「\t」爲輸出分隔符:
正則表達式估計你們都比較瞭解,就很少嘮叨了,下面列出幾個經常使用的:
字符 | 描述 |
---|---|
. | 匹配任意一個字符 |
^ | 匹配開頭。/^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的全名爲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 | 替代 |
sed '1,3d' replace.txt
sed '1a hello world' replace.txt
sed '1c hello world' replace.txt
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命令的基本使用方法,但願對你們有幫助。