shell之正則表達式及三劍客grep命令

一、正則表達式概述

什么是正則表達式?

正則表達式是一種描述字符串匹配規則的重要工具

1、正則表達式定義:

正則表達式,又稱正規表達式、常規表達式

使用字符串描述、匹配一系列符合某個規則的字符串


正則表達式

普通字符:

大小寫字母、數字、標點符號及一些其它符號


元字符:

在正則表達式中具有特殊意義的專用字符


正則表達式的層次分類

基礎正則表達式
擴展正則表達式


Linux三劍客(grep、sed、awk)支持的正則表達式

shell是不支持正則表達式的(shell支持的是通配符)。shell中的正則表達式只有個別命令支持的,一般常用的是Linux三劍客

支持正則的shell命令正則類型
grep默認使用基本正則表達式(BRE)(要使用擴展正則需要加轉義字符)
egrep 或grep -E使用擴展的正則表達式(ERE)
sed默認使用基本正則表達式(BRE)
awk使用擴展正則表達式(ERE)

2 基礎正則表達式的元字符

基礎正則表達式是常用的正則表達式部分

2.1 匹配字符

\ : 表示轉義字符,去掉特殊符號的特殊含義

\n : 匹配換行符

\t : 匹配制表符

\w : 匹配單詞字符(單詞字符:a-z,A-Z,0-9,_ )

\W : 匹配非單詞字符

\S : 匹配非空白字符

\s : 匹配空白字符

\d : 匹配數字

\D : 匹配非數字

. : 表示匹配任意單個字符(默認情況下,. 無法匹配換行符)

2.2 中括號表達式
字符組: 普通中括號包圍的字符組,表示某個單個字符匹配中括號內的任意字符即匹配成功

x[abc]z :

可以匹配包含“xaz”、“xbz”、“xcz”的字符串


取反表示法:

中括號內開頭使用 ^ ,表示只要不是中括號內的字符就匹配


x[ ^abc]z :

可以匹配包含 “xdz”、“xez” 等字符串,但不能匹配包含“xaz”、“xbz”、“xcz”的字符串


范圍表示法

[a-z]:

表示任意單個小寫字母

[ ^a-z] :

匹配非小寫字母的其它任意字符串


[A-Z] :

表示任意單個大寫字符

[0-9] :

表示任意單個數字

注意:[0-59],表示匹配0、1、2、3、4、5、9,而不是0-59中間的數值


[a-z0-9A-Z] : 表示任意字母或數字

[a-z0-9A-Z_] : 表示任意字符、數字或下劃線,也就是匹配單個字符

特殊的元字符在中括號中匹配

想要在中括號中匹配: ^ ,需要將其放在 中括號非開頭的位置 ,如:[a^]
想要在中括號中匹配: - ,需要將其放在 開頭位置或結尾位置 ,如:[abc-]、[-abc]
想要在中括號中匹配: ] ,需要將其放在 開頭位置 ,如:[]abc]


2.3 位置匹配(錨定)

只匹配位置,不匹配字符,所以不會消耗字符數量,也稱為零寬斷言

^ : 匹配行首
$ : 匹配行尾


2.4 量詞(重復匹配次數)


\{m\} : 表示匹配前一個字符或前一個子表達式m次

\{m,n\} : (m<n)表示匹配前一個字符或前一個字表達式最少m次,最多n次

\{m,\} : 表示匹配前一個字符或前一個子表達式至少m次

\{,n\} : 表示匹配前一個字符或前一個字表達式最多n次(匹配0次也算是成功)

*: 表示前一個字符或前一個子表達式匹配0次或多次,等價于:{0,}

.* : 匹配任意長度的任意字符
**注意:這些量詞均為貪婪匹配模式,就是盡可能的去匹配符合條件的字符,例如:ab. *c 去匹配字符串:abbcdecfc,其中. * 部分匹配的將是bcdecf **

2 擴展正則表達式的元字符


2.1 擴展常用的量詞


? : 表示匹配前一個字符或前一個子表達式0或1次,等價于:{0,1}或者{,1}

+: 表示匹配前一個字符或前一個子表達式1次或多次,就是最少一次,等價于:{1,}

2.2 二選一表達式


豎線 | 分隔左右兩個正則子表達式,表示匹配任何一個即可,即a|b表示:a或者b,在結果上等價[ab];但是:[0-5] |\sa 表示0、1、2、3、4、5 或者 “ a”,這種轉化不了為[]的形式。

使用二選一子表達式需要注意:

二選一元字符優先級很低,所以abc|def 表示的是abc或者def,等價于:(abc)|(def),而不是ab(c|d)ef。


2.3 分組捕獲和反向引用


使用小括號()包圍一部分正則表達式,這部分正則表達式即成為一個分組整體,也稱為一個子表達式。

根據左括號的位置決定第幾個分組

例如:(abc)def 、([a-d]){3}、 ([0-9]abc(def){2}(hgi))。
分組后可以使用\N 來反向引用對應的分組匹配結果,N是1-9的正整數,\1表示第一個分組表達式的匹配結果,\2表達第二個分組表達式的匹配結果。

注意:反向引用引用的是分組匹配后的結果,不是分組表達式

例如:正則表達式:(abc|def) and \1xyz 可以匹配字符串“abc and abcxyz ” 或“def and defxyz”,但是不能匹配“abc and defxyz” 或 “def and abcxyz”
?

二、grep命令的使用

1、grep命令簡介

grep是一種強大的文本搜索工具,它能使用正則表達式,并把匹配的行打印出來。

格式

grep  [options]  pattern   [file]options表示:選項; pattern 表示:匹配的的表達式 ; file 表示:文件名例如:grep  -i  "root" /etc/passwd

2、常用選項

常用選項功能
-n列出所匹配的文本行,并顯示行號
-i匹配時忽略字符大小寫
-v反向匹配,匹配的字符串與搜索的不相符
-w精確匹配。匹配整個單詞
-o只顯示匹配的部分
-c顯示匹配內容的行數

3、grep 的選項使用案例

案例:過濾出/etc/passwd中的root,并添加行號(-n)

?

案例:過濾出/etc/passwd 中的FTP,不區分大小寫(-i)

案例:過濾/etc/passwd 中的不包含root的行,并且顯示行號(-v)

?

案例:精準搜索單詞,只匹配到單詞所在的行(-w)?

?案例:將匹配到的單詞羅列出來(-o)

?案例:顯示匹配的內容的行數(-c)

三、grep加上正則使用案例

1、中括號表達式案例

案例1:搜索既可以查找shirt也可以查找short的單詞所在行

?

?案例2:搜索oo前面不是大小寫字母開頭的行

案例3:查找包含數字的行?

2、位置錨定案例

案例1:搜索以.結尾的行

案例2:搜索以y開頭的行?

3、量詞案例

案例1:搜索2個oo的行?

?

為了匹配了6個o,但是要求搜索的是2個o?答:因為正則表達式是一行一行的檢索的,表達式是2個o,搜索的內容時一個很長的字符串。
先拿表達式中的第一個字符與字符串匹配,匹配不到,進行下一個匹配,最后匹配到了mgoooooood中的o
匹配成功,然后匹配第二個o,也匹配成功,然后就會將匹配的兩個字符消耗掉,再繼續重新匹配到下一個字符
最后消耗掉三次,也就是6個o,第7個o雖然匹配成功,但是第8個字符不是o,所以不會匹配成功。

?案例2:查看o這個字符,最少出現3次,最大出現6次

案例3:查找o這個字符,最少出現5次的行?

案例:特殊的量詞案例?

4、二選一表達式和分組案例

案例1:搜索以y開頭或者以d結尾的行

案例2:搜索shirt和short所在的行?

?四、總結

正則元字符描述grepegrepsedawk
\轉義符,將特殊字符進行轉義,忽略其特殊意義支持支持支持支持
^匹配行首支持支持支持支持
$匹配行尾支持支持支持支持
.匹配除換行符\n 之外的任意單個字符支持支持支持支持
[]匹配包含在[字符]之中的任意一個字符支持支持支持支持
[^]匹配[ ^z字符]之外的任意一個字符支持支持支持支持
[-]匹配 []中指定范圍的任意一個字符,要寫成遞增支持支持支持支持
*匹配前導字符或子表達式0次或多次支持支持支持支持
匹配前導字符或子表達式0次或1次不支持(加\)支持不支持(加\)支持
+匹配前導字符或子表達式1次或多次不支持(加\)支持不支持(加\)支持
()匹配表達式,創建一個用于匹配的字串不支持(加\)支持不支持(加\)支持
{n}匹配前導字符或子表達式n次,可以為0不支持(加\)支持不支持(加\)支持
{n,}匹配前導字符或子表達式至少n次不支持(加\)支持不支持(加\)支持
{n,m}匹配前導字符或子表達式,最少匹配n次,最低匹配m次,n<=m不支持(加\)支持不支持(加\)支持
|交替匹配| 兩邊的任意一項不支持(加\)支持不支持(加\)支持

?

?

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

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

相關文章

opencv視頻截取每一幀并保存為圖片python代碼CV2實現練習

當涉及到視頻處理時&#xff0c;Python中的OpenCV庫提供了強大的功能&#xff0c;可以方便地從視頻中截取每一幀并將其保存為圖片。這是一個很有趣的練習&#xff0c;可以讓你更深入地了解圖像處理和多媒體操作。 使用OpenCV庫&#xff0c;你可以輕松地讀取視頻文件&#xff0…

判斷推理 -- 圖形推理 -- 位置規律

一組圖&#xff1a;從前往后找規律。 二組圖&#xff1a;從第一組圖找規律&#xff0c;第二組圖應用規律。 九宮格&#xff1a; 90%橫著看找規律&#xff0c;第一行找規律&#xff0c;第二行驗證規律&#xff0c;第三行應用規律。 所有有元素組成都是線&#xff0c;三角形&…

面試熱題(驗證二叉搜索樹)

給你一個二叉樹的根節點 root &#xff0c;判斷其是否是一個有效的二叉搜索樹。 有效 二叉搜索樹定義如下&#xff1a; 節點的左子樹只包含 小于 當前節點的數。節點的右子樹只包含 大于 當前節點的數。所有左子樹和右子樹自身必須也是二叉樹 二叉樹滿足以上3個條件&#xff0c…

spark的使用

spark的使用 spark是一款分布式的計算框架&#xff0c;用于調度成百上千的服務器集群。 安裝pyspark # os.environ[PYSPARK_PYTHON]解析器路徑 pyspark_python配置解析器路徑 import os os.environ[PYSPARK_PYTHON]"D:/dev/python/python3.11.4/python.exe"pip inst…

喜盈門、夢百合競相入局,智能床墊起風了

配圖來自Canva可畫 現代人的生活壓力普遍大&#xff0c;熬夜、失眠是常有的事&#xff0c;提高睡眠質量十分的重要。近些年來&#xff0c;市面上出現了許多輔助睡眠的產品&#xff0c;比如香薰、褪黑素、蒸汽眼罩、降噪耳塞、助眠枕、睡眠監測app等助眠神器。可以說為了睡個好…

【CLion + ROS2】在 clion 中編譯調試 ros2 package

目錄 0 背景1. 命令行編譯 ros2 package2. 使用 clion 打開 ros2 工程3. 使用 clion 編譯整個 ros2 工程3.1 使用 clion 的 external tool 配置 colcon build3.2 開始編譯 dev_ws 工程3.3 編譯結果&#xff1a; 4. 調試單獨的 ros2 package4.1 創建 ros2 package 的獨立的 colc…

【Git】版本控制器詳解之git的概念和基本使用

版本控制器git 初始Gitgit的安裝git的基本使用初始化本地倉庫配置本地倉庫三區協作添加---add修改文件--status|diff版本回退--reset撤銷修改刪除文件 初始Git 為了能夠更?便我們管理不同版本的?件&#xff0c;便有了版本控制器。所謂的版本控制器&#xff0c;就是?個可以記…

yolo源碼注釋2——數據集配置文件

代碼基于yolov5 v6.0 目錄&#xff1a; yolo源碼注釋1——文件結構yolo源碼注釋2——數據集配置文件yolo源碼注釋3——模型配置文件yolo源碼注釋4——yolo-py 數據集配置文件一般放在 data 文件夾下的 XXX.yaml 文件中&#xff0c;格式如下&#xff1a; path: # 數據集存放路…

基于ssm+vue的新能源汽車在線租賃管理系統源碼和論文PPT

基于ssmvue的新能源汽車在線租賃管理系統源碼和論文PPT010 開發環境&#xff1a; 開發工具&#xff1a;idea 數據庫mysql5.7(mysql5.7最佳) 數據庫鏈接工具&#xff1a;navcat,小海豚等 開發技術&#xff1a;java ssm tomcat8.5 摘 要 隨著科學技術的飛速發展&#xff0…

Ajax及前端工程化

Ajax&#xff1a;異步的js與xml。 作用&#xff1a; 1、通過ajax給服務器發送數據&#xff0c;并獲得其響應的數據。 2、可以在不更新整個網頁的情況下&#xff0c;與服務器交換數據并更新部分網頁的技術。 一、同步與異步 二、原生Ajax 1、準備數據地址 2、創建XMLHttpReq…

SCSS的基本用法

1、聲明變量 $ 聲明變量的符號 $ 下面這張圖左半部分是scss的語法&#xff0c;右半部分是編譯后的css。&#xff08;整篇文章皆是如此&#xff09; 2、默認變量 !default sass 的默認變量僅需要在值后面加上 !default 即可。 如果分配給變量的值后面添加了 !default 標志…

Qt 雜項(Qwt、樣式等)

Qt隱藏窗口邊框 this->setWindowFlags(Qt::FramelessWindowHint);Qt模態框 this->setWindowModality(Qt::ApplicationModal);QLable隱藏border 代碼中設置 lable->setStyleSheet("border:0px");或者UI中直接設置樣式&#xff1a;“border:0px” Qwt開源…

JS實現樹形結構、一維數組以及map之間的轉換

const treeData[ {id:1, name:中國, children:[ {id:11,name:河南省,children:[{id:111,name:南陽市,children:[{id:1111,name:淅川縣,children:null}]},{id:112,name:鄭州市,children:[{id:1121,name:中牟縣,children:null}]}] }, {id:22,name:廣東省,children:[{id:221,name:…

c++中的多態

文章目錄 1.多態的概念1.1概念 2.多態的定義及實現2.1多態的構成條件2.2虛函數2.3虛函數的重寫2.4 C11 override 和 final2.5 重載、覆蓋(重寫)、隱藏(重定義)的對比 3. 抽象類3.1概念3.2接口繼承和實現繼承 4.多態的原理4.1虛函數表4.2多態原理分析4.3 動態綁定與靜態綁定 5.單…

學習筆記整理-面向對象-03-構造函數

一、構造函數 1. 用new調用函數的四步走 new 函數();JS規定&#xff0c;使用new操作符調用函數會進行"四步走"&#xff1a; 函數體內會自動創建出一個空白對象函數的上下文(this)會指向這個對象函數體內的語句會執行函數會自動返回上下文對象&#xff0c;即使函數沒…

HDMI接口的PCB布局布線要求

高清多媒體接口&#xff08;High Definition Multimedia Interface&#xff09;&#xff0c;簡稱&#xff1a;HDMI&#xff0c;是一種全數字化視頻和聲音發送接口&#xff0c;可以發送未壓縮的音頻及視頻信號。隨著技術的不斷提升&#xff0c;HDMI的傳輸速率也不斷的提升&#…

使用GEWE框架進行微信群組管理(三)

友情鏈接&#xff1a;GEWE框架官網 geweapi.com 點擊訪問即可。 邀請或添加聯系人進群 小提示&#xff1a; 不管是添加40人以內還是以上都用此接口cause填寫邀請進群的理由 請求URL&#xff1a; http://域名地址/api/group/invite 請求方式&#xff1a; POST 請求頭&…

brew+nginx配置靜態文件服務器

背景 一下子閑下來了&#xff0c;了解的我的人都知道我閑不下來。于是&#xff0c;我在思考COS之后&#xff0c;決定自己整一個本地的OSS&#xff0c;實現靜態文件的訪問。那么&#xff0c;首屈一指的就是我很熟的nginx。也算是個小復習吧&#xff0c;復習一下nginx代理靜態文…

解決生成式AI落地之困,亞馬遜云科技提供完整解決方案

生成式AI技術無疑是當前最大的時代想象力之一。 資本、創業者、普通人都在涌入生成式AI里去一探究竟&#xff1a;“百模大戰”連夜打響&#xff0c;融資規模連創新高&#xff0c;各種消費類產品概念不斷涌現……根據Bloomberg Intelligence 的報告&#xff0c;2022年生成式AI 市…