十、通配符和正則表達式

10.1 通配符

通配符是由shell處理的, 它只會出現在 命令的“參數”里。當shell在“參數”中遇到了通配符

時,shell會將其當作路徑或文件名去在磁盤上搜尋可能的匹配:若符合要求的匹配存在,則進

行代換(路徑擴展);否則就將該通配符作為一個普通字符傳遞給“命令”,然后再由命令進行處

理。總之,通配符 實際上就是一種shell實現的路徑擴展功能。在 通配符被處理后, shell會先

完成該命令的重組,然后再繼續處理重組后的命令,直至執行該命令。

10.1.1 SHELL中的通配符

10.1.2 通配符實例

1、顯示所有menu0開頭的文件

[root@kittod ~]# ls menu0*
menu01.sh menu02.sh menu03.sh menu04.sh

2、顯示所有m開頭后面只有單個字符的文件

[root@kittod ~]# ls m?
m1 m2 m3

3、顯示所有m或者n開頭的文件

[root@kittod ~]# ls [mn]*
m1 m2 m3 menu01.sh menu02.sh menu03.sh menu04.sh n71 n72 n73

4、顯示所有以字母開頭的文件

[root@kittod ~]# ls [A-z]*
BC1 BC2 BC3 m1 m2 m3 menu01.sh menu02.sh menu03.sh menu04.sh 
n71 n72 n73

5、顯示所有數字開頭的文件

[root@kittod ~]# ls [0-9]*
12a 12b 12c 12d

6、查看所有不區分大小寫的字母開頭的文件

[root@kittod ~]# ls [[:alpha:]]*
BC1 BC2 BC3 m1 m2 m3 menu01.sh menu02.sh menu03.sh menu04.sh 
n71 n72 n73

7、查看所有以數字開頭的文件

[root@kittod ~]# ls [[:digit:]]*
12a 12b 12c 12d

8、查看所有以字母或者數字開頭的文件

[root@kittod ~]# ls [[:alnum:]]*
12a 12b 12c 12d BC1 BC2 BC3 m1 m2 m3 menu01.sh menu02.sh menu03.sh menu04.sh n71 n72 n73

10.2 正則表達式介紹和使用

在Linux命令行操作或者SHELL編程中總是容易混淆一些特殊字符的使用,比如元字符‘*’號,作為通配符匹配文件名時表示0個到無窮多個任意字符。而作為正則表達式匹配字符串時,表示重復0個到無窮多個的前一個字符。對于通配符和正則表達式之間容易理解的方法就是,在文本過濾命令中這些元字符是用做正則表達式,比如像awk,sed,grep等,主要是針對文件內容的。然而通配符多用在文件名上,比如查找find,ls,cp,mv等等。沒有特殊說明,正則表達式就是指基礎正則表達式。

10.2.1 什么是正則表達式

正則表達式是通過一些特殊字符的排列,用以查找、替換、刪除一行或多行文字字符串,簡單的說,正則表達式就是用在字符串的處理上面的一項表示式。由于正則表達式語法簡練,功能強大,得到了許多程序設計語言的支持,包括Java、C++、Perl以及Shell等。

10.2.2 為什么使用正則表達式

在進行程序設計的過程中,用戶會不可避免地遇到處理某些文本的情況。有的時候,用戶還需要查找符合某些比較復雜規則的字符串。對于這些情況,如果單純依靠程序設計語言本身,則往往會使得用戶通過復雜的代碼來實現。但是,如果使用正則表達式,則會以非常簡短的代碼來完成。

10.2.3 如何學習正則表達式

1. 重點在于理解元字符

2. 掌握好正則表達式的語法

3. 開拓思路,尋找最佳的表達方法

10.2.4 如何使用正則表達式

當一個正則表達式完成之后,并能夠保證這個表達式一定是準確的,需要不斷地測試才可以確定其正確與否。在不同的環境下,用戶需要不同的工具來幫助他完成測試的過程。如果是在Shell命令行中,用戶可以使用grep命令來測試。

grep家族有三大成員分別為:

grep:支持使用基本正則表達式。

egrep:支持使用擴展正則表達式。

fgrep:不支持使用正則表達式,即所有的正則表達式中的元字符都將作為一般字符,僅僅擁有其字面意義,不再擁有特殊意義。

grep命令的名稱來自于全局搜索正則表達式并打印文本行(Global Search Regular Expression and Print out the line)的縮寫。它是一個非常古老的UNIX命令,也是一種強大的文本搜索工具。grep命令使用正則表達式來搜索文本,并且把匹配的文本行打印出來。

grep命令根據用戶指定的”pattern(過濾條件)“對目標文本逐行進行匹配檢查;打印出符合條件的行,即文本搜索工具。注:PATTERN即過濾條件指由文本字符及正則表達式元字符所編寫的字符串。

grep命令的基本語法如下:grep [options] pattern [file…]

在上面的語法中,options表示選項,選項列表如下表。pattern表示要匹配的模式,file表示

一系列的文件名。grep命令會從一個或者多個文件中搜索滿足指定模式的文本行,并且打印出

來。模式后面的所有的字符串參數都被看作是文件名。

-n :顯示行號
-o :只顯示匹配的內容
-q :靜默模式,沒有任何輸出,得用$?來判斷執行成功沒有,即有沒有過濾到想要的內容
-l :如果匹配成功,則只將文件名打印出來,失敗則不打印,通常-rl一起用,grep -rl
'root' /etc
-A :如果匹配成功,則將匹配行及其后n行一起打印出來
-B :如果匹配成功,則將匹配行及其前n行一起打印出來
-C :如果匹配成功,則將匹配行及其前后n行一起打印出來
--color:高亮顏色顯示匹配到的字符串
-c :如果匹配成功,則將匹配到的行數打印出來
-E :等于egrep,擴展
-i :忽略大小寫
-v :取反,不匹配
-w:匹配單詞
-r:遞歸搜索,不僅搜索當前目錄,還要搜索其各級子目錄
-s:不顯示關于不存在或者無法讀取文件的錯誤信息

10.3 基本正則表達式

基本正則表達式(Basic Regular Expression,BRE),又稱為標準正則表達式,是最早制訂的正則表達式規范,僅支持最基本的元字符集。基本正則表達式是POSIX規范制訂的兩種正則表達式語法標準之一,另外一種語法標準稱為擴展正則表達式。

示例:

1)^word 表示搜索以word開頭的內容。

[root@server ~]# grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@server ~]# grep ^root /etc/passwd
root:x:0:0:root:/root:/bin/bash

2)word$ 表示搜索以word結尾的內容。

[root@server ~]# grep bash passwd
root:x:0:0:root:/root:/bin/bash
fox:x:1000:1000::/home/fox:/bin/bash
cel:x:1001:1001::/home/cel:/bin/bash
[root@server ~]# grep bash$ passwd
root:x:0:0:root:/root:/bin/bash
fox:x:1000:1000::/home/fox:/bin/bash
cel:x:1001:1001::/home/cel:/bin/bash

3)^$ 表示空行,不是空格。

[root@server ~]# grep ^$ passwd [root@server ~]# grep ^$ passwd -n
18:
19:
20:
25:
29:

4). 代表且只能代表一個任意字符。

[root@server ~]# grep r.t passwd
operator:x:11:0:operator:/root:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
[root@server ~]# grep r..t passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
[root@server ~]# grep r...t passwd
unbound:x:997:996:Unbound DNS resolver:/etc/unbound:/sbin/nologin

5)* 重復0個或多個前面的字符

[root@server ~]# grep r*t passwd

6)[] 匹配字符集合內任意一個字符,如[a-z]

[root@server ~]# grep r[a-z]t passwd
operator:x:11:0:operator:/root:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
[root@server ~]# grep r[a-z]*t passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
systemd-timesync:x:988:988:systemd Time Synchronization:/:/usr/sbin/nologi

7. [^abc]在中括號里表示非,不包含a或b或c

[root@server ~]# grep r[^a-z]*t passwd
rt
r.t
r..t

8){n,m} 匹配n到m次,前一個字符。

{n,} 至少N次,多了不限。

{n} n次

{,m} 至多m次,少了不限。

注意:grep要將{}轉義,{},egrep不需要轉義

[root@kittod ~]# grep 'r[^a-z]\{3,\}' passwd
[root@kittod ~]# grep -E 'r[^a-z]{3,}' passwd

10.4 擴展正則表達式

擴展正則表達式(Extended Regular Expression,ERE)支持比基本正則表達式更多的元字符,但是擴展正則表達式對有些基本正則表達式所支持的元字符并不支持。前面介紹的元字符“^”、“$”、“.”、“*”、“[]”以及“[^]”這6個元字符在擴展正則表達式都得到了支持,并且其意義和用法都完全相同,不再重復介紹。接下來重點介紹一下在擴展正則表達式中新增加的一些元字符。

10.5 正則表達式案例

1、顯示/etc/passwd文件中以bash結尾的行;

[root@server ~]# grep bash$ /etc/passwd

2、找出/etc/passwd文件中的三位或四位數;

[root@server ~]# grep '[[:digit:]]\{3,4\}' /etc/passwd
[root@server ~]# grep -E '[[:digit:]]{3,4}' /etc/passwd

3、找出/etc/grub2.cfg文件中,以至少一個空白字符開頭,后面又跟了非空白字符的行;

[root@server ~]# grep "^[[:space:]]\+[^[:space:]]" /etc/grub2.cfg

4、找出"netstat -tan”命令的結果中,以‘LISTEN’后跟0個或多個空白字符結尾的行;

[root@server ~]# netstat -tan | grep "LISTEN[[:space:]]*$"

5、找出"fdisk -l“命令的結果中,取出硬盤路徑;

 [root@server ~]#  fdisk -l | grep Disk | grep /dev/nv | cut -d: -f 1 | cut -d " " -f2

6、找出”ldd /usr/bin/cat“命令的結果中文件路徑;

[root@server ~]# ldd /usr/bin/cat | egrep [[:blank:]]\+/[[:graph:]]*

7、找出/proc/meminfo文件中,所有以大寫或小寫s開頭的行

[root@server ~]# grep -i ^S /proc/meminfo

8、顯示當前系統上root、centos或spark用戶的相關信息;

[root@server ~]# grep -E ^"(root|centos|spark)" /etc/passwd
[root@server ~]# egrep ^"(root|centos|spark)" /etc/passwd

9、echo輸出一個絕對路徑,使用egrep取出其基名;

[root@server ~]# echo /mnt/sdc/ | grep -E -o "[^/]+/?$" | cut -d "/" -f 1

10、找出ifconfig命令結果中的1-255之間的整數;

[root@server ~]# ifconfig | egrep -w "[1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]"

11. 找出ifconfig命令輸出中的所有IP地址

 [root@server ~]# ifconfig | egrep -o "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"

10.6 正則表達式練習

1、顯示/etc/rc.d/rc.sysinit文件中以不區分大小的h開頭的行;

[root@server ~]# grep -i ^h /etc/rc.d/rc.sysinit

2、顯示/etc/passwd中以sh結尾的行;

[root@server ~]# grep sh$ /etc/passwd

3、顯示/etc/fstab中以#開頭,且后面跟一個或多個空白字符,而后又跟了任意非空白字符的行;

[root@server ~]# grep -E ^#[[:space:]]+[^[:space:]]* /etc/fstab 
或者
[root@server ~]# grep -E ^#[[:space:]]\{1,\}[^[:space:]]* /etc/fstab 

4、查找/etc/rc.d/rc.local中包含“以to開始并以to結尾”的字串行;

[root@server ~]# grep -E to[A-z]*to /etc/inittab

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/15622.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/15622.shtml
英文地址,請注明出處:http://en.pswp.cn/web/15622.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python安裝依賴

創建 requirement.txt 文件并填充內容 flask2.0.0 pandas1.3.3 numpy1.21.2 安裝模塊 pip install -r requirement.txt

Spring boot使用集群方式、支持ssl連接redis的方法

1、需求背景 項目需要提供一個管理界面給內部人員操作用戶信息,需要在修改用戶信息后刪除用戶的redis緩存。用戶所在的區域不同,其redis服務地址也不相同,因此需要管理多個redis連接,且redis要求以集群方式并支持ssl進行連接。 2…

Qt for android 獲取USB設備列表(一)Java方式 獲取

簡介 QtActivity 作為 Qt 應用程序的入口點,負責啟動和配置 Qt 應用程序的信息, 后面我們繼承 QtActivity 做自定義控制,了解一下 Activity 生命周期概念, 因為 QtActivity 繼承自Android的activity,使用周期函數完成我…

java8新特性——函數式編程詳解

目錄 一 概述1.1 背景1.2 函數式編程的意義1.3 函數式編程的發展 Lambda表達式1.1 介紹1.2 使用Lambda的好處1.3 Lambda方法1.3.1 Lambda表達式結構1.3.2 Lambda表達式的特征 1.4 Lambda的使用1.4.1 定義函數式接口1.4.2 Lambda表達式實現函數式接口1.4.3 簡化Lambda表達式1.4.…

C++學習/復習4--與類相關的概念/默認成員函數/運算符重載/Date類實現案例

一、類和對象 1.本章概要 2.C中的結構體(struct與class) 升級為類 (1)類及成員函數的兩種定義方式 聲明與定義分離 (2)權限 注意1:struct/class在權限上的區別 (3)封裝 (4&#x…

AI學習指南數學工具篇-凸優化之對偶性與拉格朗日對偶

AI學習指南數學工具篇-凸優化之對偶性與拉格朗日對偶 在凸優化中,對偶性是一個非常重要的概念。通過對偶性,我們可以將原始問題轉化為對偶問題,從而更容易求解。其中,拉格朗日對偶問題是對偶性的一個重要應用,通過拉格…

《Ai學習筆記》自然語言處理 (Natural Language Processing):機器閱讀理解-基礎概念解析01

自然語言處理 (Natural Language Processing): NLP四大基本任務 序列標注: 分詞、詞性標注 分類任務: 文本分類、情感分析 句子關系:問答系統、對話系統 生成任務:機器翻譯、文章摘要 機器閱讀理解的定義 Machi…

LangChain - 建立代理

本文翻譯整理自:Build an Agent https://python.langchain.com/v0.2/docs/tutorials/agents/ 文章目錄 一、說明概念 二、定義工具1、TavilyAPI參考: 2、RetrieverAPI參考:API參考: 3、工具 三、使用語言模型四、創建代理五、運行…

《安富萊嵌入式周報》第337期:超高性能信號量測量,協議分析的開源工具且核心算法開源,工業安全應用的雙通道數字I/O模組,低成本腦機接口,開源音頻合成器

周報匯總地址:http://www.armbbs.cn/forum.php?modforumdisplay&fid12&filtertypeid&typeid104 視頻版: https://link.zhihu.com/?targethttps%3A//www.bilibili.com/video/BV1PT421S7TR/ 《安富萊嵌入式周報》第337期:超高性…

【Spring Boot】分層開發 Web 應用程序(含實例)

分層開發 Web 應用程序 1.應用程序分層開發模式:MVC1.1 了解 MVC 模式1.2 MVC 和三層架構的關系 2.視圖技術 Thymeleaf3.使用控制器3.1 常用注解3.1.1 Controller3.1.2 RestController3.1.3 RequestMapping3.1.4 PathVariable 3.2 將 URL 映射到方法3.3 在方法中使用…

用戶數據報協議UDP實現可靠傳輸的思路

一、UDP協議的特點 按照報文來分割發送。不需要建立連接和維護連接。不需要接收確認。速度較快。不確保接收的順序和發送順序一樣。 二、用UDP實現可靠通信的思路 (一)接收時發送一個確認報文 實現接收確認的機制。 (二)每個報文騰出空間放置序號 發送時設置序號&#xff0c…

如何安裝虛擬機Wmware,并且在虛擬機中使用centos系統

1. 前言 大家好,我是jiaoxingk 本篇文章主要講解如何安裝虛擬機,并且在虛擬機中安裝centos系統,讓windows電腦也能夠使用Linux系統 2. 虛擬機的介紹 在安裝Vmware之前,我們先做虛擬機的介紹 虛擬機:通過軟件虛擬出來的…

Docker拉取鏡像報錯:x509: certificate has expired or is not yet v..

太久沒有使用docker進行鏡像拉取,今天使用docker-compose拉取mongo發現報錯(如下圖): 報錯信息翻譯:證書已過期或尚未有效。 解決辦法: 1.一般都是證書問題或者系統時間問題導致,可以先執行 da…

用HAL庫改寫江科大的stm32入門例子-6-2 定時器外部時鐘

實驗目的: 熟悉外部時鐘的應用。 實驗步驟: 創建項目參照前面的文章,集成oled(沒有oled,用uart串口傳遞也可以)選擇外部時鐘源時鐘源參數設置編寫代碼: 5.1聲明全局變量,如果發生定時器中斷的時候,在回調…

SW 零件插入零件的重合配合

重合配合有時候會失效,可以先用距離配合代替,之后修改距離盡量接近

AI網絡爬蟲-自動獲取百度實時熱搜榜

工作任務和目標&#xff1a;自動獲取百度實時熱搜榜的標題和熱搜指數 標題&#xff1a;<div class"c-single-text-ellipsis"> 東部戰區臺島戰巡演練模擬動畫 <!--48--></div> <div class"hot-index_1Bl1a"> 4946724 </div> …

【bash】統計服務器信息腳本

起因 寫一個bash腳本統計服務器的機器名、內網IP、CPU使用率、內存使用率、List{GPU使用率、顯存} 腳本 #!/bin/bash# 主機名 hostname$(hostname) # 內網ip ip$(ip addr | grep inet | grep -v 127.0.0.1 | awk {print $2} | cut -d/ -f1) ip$(echo "$ip"|tr \n…

Excel表格在線解密:輕松解密密碼,快速恢復數據

忘記了excel表格密碼&#xff1f;教你簡單兩步走&#xff1a;具體步驟如下。首先&#xff0c;在百度搜索中鍵入“密碼帝官網”。其次&#xff0c;點擊“立即開始”&#xff0c;在用戶中心上傳表格文件即可找回密碼。這種方法不用下載軟件&#xff0c;操作簡單易行&#xff0c;適…

【DZ模板】價值288克米設計APP手機版DZ模板 數據本地化+完美使用

模版介紹 【DZ模板】價值288克米設計APP手機版DZ模板 數據本地化完美使用 騰訊官方出品discuz論壇DIY的后臺設置&#xff0c;功能齊全&#xff0c;論壇功能不亞于葫蘆俠&#xff0c;自定義馬甲&#xff0c;自定義認證&#xff0c;自定義廣告&#xff0c;完全可以打造出自己想…