1. 程式人生 > 其它 >linux中find命令、正則表示式、三劍客之grep基本使用

linux中find命令、正則表示式、三劍客之grep基本使用

一、find命令的基本使用

  • find 命令主要用於查詢目錄和檔案,可以指定多種引數進行匹配

  • 用法:find +查詢路徑 +命令引數 [輸出形式]

  • 查詢路徑:告訴find在哪查詢

  • 命令引數:指定要查詢的檔案屬性,屬性包括多種,型別、名稱、大小、修改時間等等

1、常用的引數

引數:
	-name : 按照檔案的名字查詢檔案
		* :萬用字元
	-iname :  按照檔案的名字查詢檔案(忽略大小寫)
	-size : 按照檔案的大小查詢檔案
		+	: 大於
		-	: 小於
		沒符號 : 等於

	-mtime : 按照修改時間去查詢
		+(可以省略) : n 天以前
		- 			: n 天以內
	-atime
	-ctime 

	-user :按照使用者的屬主查詢
	-group : 按照使用者的屬組查詢
	-type : 按照檔案的型別查詢
		d : 資料夾
		l : 連結檔案
		s : 套接字檔案
		p : 管道檔案
		c : 字元檔案
		b :磁碟檔案
		f : 普通檔案

	-perm : 按照檔案的許可權查詢
	-inum : 根據index node號碼查詢

	-a : 並且(可以省略,預設時並且)
	-o : 或者
	-maxdepth : 查詢的目錄深度(必須放置與第一個引數位) 

	-exec : 將find處理好的結果交給其他命令繼續處理。
	
	知識儲備:
	dd : 生成檔案
		if 		:從什麼地方讀
		of 		: 寫入到什麼檔案
		bs 		: 每次寫入多少內容
		count 	: 寫入多少次

案例:

find . -maxdepth 1 -name "1.txt"  # 直接指定檔名查詢 ,-maxdepth 1表示最大查詢層級為一級目錄
find . -maxdepth 1 -name "*.txt"  # 在當前目錄下查詢.txt結尾的檔案
find . -maxdepth 1 -name "*.txt"  # 在當前目錄下查詢.txt結尾的檔案
find . -maxdepth 1 -name "[0-9]*.txt"  # 查詢以數字開頭的檔案
find . -maxdepth 1 -mtime -5  # 查詢當前目錄下,5天之內有修改過的檔案

find . -maxdepth 1 -mtime +5  # 查詢當前目錄下,修改時間超過5天的檔案

find . -maxdepth 1 -type d  # 在當前目錄中查詢型別是目錄的檔案,最大查詢層級一級目錄(會查詢隱藏的目錄)

案例知識: xargs 將管道前命令的執行結果當作引數逐個傳遞後管道後的命令

ls [a-z].txt | xargs -n1 -i{} mv {} {}.bak   # 將當前目錄中以單個字母命名的txt檔案增加一個.bak字尾,-n1意思是一個一個物件的去處理,-i{} 把前面的物件使用{}取代,mv {} {}.bak 相當於 mv a.txt a.txt.bak


二、正則表示式

  • 正則表示式是一種字元模式,用於在查詢過程中匹配製定的字元

    • 元字元通常在Linux中分為兩類:Shell元字元,由Linux Shell進行解析;

    • 元字元通常在Linux中分為兩類:Shell
      元字元,由Linux Shell進行解析;

    • 正則表示式一般以文字行進行處理

  • 正則表示式元字元

特殊的元字元

字元 說明
IFS 由 或 或 三者之一組成(我們常用 space )
CR 由 產生
= 設定變數
$ 取變數值或取運算值
> 重定向 stdout
< 重定向 stdin
| 管道符號管道’|'可將命令的結果輸出給另一個命令作為輸入之用:
& 重導向 file descriptor ,或將命令置於背景執行
( ) 將其內的命令置於 nested subshell 執行,或用於運算或命令替換
{ } 將其內的命令置於 non-named function 中執行,或用在變數替換的界定範圍
; 在前一個命令結束時,而忽略其返回值,繼續執行下一個命令
&& 在前一個命令結束時,若返回值為 true,繼續執行下一個命令
|| 在前一個命令結束時,若返回值為 false,繼續執行下一個命令
! 運算意義上的非(not)的意思
# 註釋,常用在指令碼中
\ 轉義字元,去除其後緊跟的元字元或萬用字元的特殊意義

擴充套件的正則表示式

案例:

	案例1:在/etc/passwd檔案中,匹配以ftp開頭的行
		grep '^ftp' /etc/passwd

	案例2:在/etc/passwd檔案中,匹配以bash結尾的行
		grep 'bash$' /etc/passwd

	案例3:匹配本機中有哪些ip
		ip a | grep -oE '([0-9]{1,3}\.){3}[0-9]{1,3}'

	案例4:要求將/etc/fstab中的去掉包含 # 開頭的行,且要求 # 後至少有一個空格
		grep -vE '^#\ +' /etc/fstab

	案例5:找出檔案中至少有一個空格的行
		grep -E '\ +' xxx

	案例6:將 nginx.conf 檔案中以#開頭的行和空行,全部刪除 
		grep -vE '^\ *#|^$' /etc/nginx/nginx.conf

三、linux三劍客之grep

  • Linux 最重要的三個命令在業界被稱為三劍客,它們是:awksedgrep

    • 我們在使用 Linux 系統中,grep 命令的使用尤為頻繁,熟練掌握 grep 的常見用法,能夠極大地提高你的工作效率。

    • grep 命令是一種強大的文字搜尋工具,它能使用正則表示式,按照指定的模式去匹配,並把匹配的行打印出來。需要注意的是,grep 只支援匹配而不能替換匹配的內容

# linux三劍客之一,文字過濾器(根據文字內容過濾檔案)。

語法格式:
	grep [引數] [匹配規則] [操作物件]

案例:文章中的示例 需要一個樣例檔案,檔案內容如下

1. 把包含 syslog 的行過濾出來

2. 把以 ntp 開頭的行過慮出來

3. 把匹配 ntp 的行以及下邊的兩行過濾出來

4. 把包含 syslog 及上邊的一行過濾出來

5. 把包含 syslog 以及上、下一行內容過濾出來

6. 過濾某個關鍵詞,並輸出行號

7. 過濾不包含某關鍵詞,並輸出行號

8. 刪除掉空行

9. 過濾包含 root 或 syslog 的行

10. 檢視當前目錄中包含某關鍵詞的所有檔案(這個很有用)

引數:
	-n : 過濾文字時,將過濾出來的內容在檔案內的行號顯示出來
	-A : 匹配成功之後,將匹配行的後n行顯示出來
	-B : 匹配成功之後,將匹配行的前n行顯示出來
	-C : 匹配成功之後,將匹配行的前後各n行顯示出來
	-c :  只顯示匹配成功的行數
	-o :  只顯示匹配成功的內容
	-v :  反向過濾
	-q :  安靜模式,不輸出任何資訊,指令碼中常用
	-i : 忽略大小寫
	-l :  匹配成功之後,將文字的名稱打印出來
	-R|-r : 遞迴匹配 
	--color:以顏色突出顯示匹配到的字串
	-E : 使用拓展正則   等價於  egrep

知識儲備:
	$? : 上一行命令執行的結果,0代表執行成功,其他數字代表執行失敗。
	wc :  匹配行數
		-l : 列印匹配行數
		-c : 列印匹配的位元組數
	

在/etc目錄下,有多少個檔案包含root。
	grep -rl 'root' /etc/ | wc -l
  • 與 grep 相似的工具還有 egrepfgrep,實用性並不強,其功能完全可以通過 grep 的擴充套件引數來實現,所以就不再擴充套件。