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


前幾天面試,被一位面試官嫌棄了“你的Linux命令有點low”。被嫌棄也挺正常的,因為我的簡歷寫的我自己都有點看不下去:了解Linux常用命令,如lstail -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命令的基本使用方法,希望對大家有幫助。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM