來聊一聊不low的Linux命令——find、grep、awk、sed

前幾天面試,被一位面試官嫌棄了「你的Linux命令有點low」。被嫌棄也挺正常的,由於個人簡歷寫的我本身都有點看不下去:瞭解Linux經常使用命令,如lstail -f等命令,基本知足平常的開發。面試官人很好,整個面試進行地也很愉快。說內心話,仍是挺感激的,由於不多有面試官會指出個人簡歷上出現的問題。因此呢,今天就來聊一聊不low的Linux命令——搜索文件的find命令、搜索文件內容的grep命令、對文件內容進行統計的awk命令、批量替換文件內容的sed命令。html

find命令

find簡介

find命令是一個用於搜索文件的命令。find命令的基本語法:find path [option] paramsjava

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]3d

若是沒有提供文件名,則grep命令將會搜索標準輸入。日誌

主要選項(option)以下表:code

選項 含義
-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命令的基本使用方法,但願對你們有幫助。

相關文章
相關標籤/搜索