【Linux命令行與Shell腳本編程】第十九章 正則表達式

Linux命令行與Shell腳本編程 第十九章 正則表達式


文章目錄

  • Linux命令行與Shell腳本編程 第十九章 正則表達式
  • 九.正則表達式
    • 9.1.正則表達式基礎
      • 9.1.1.正則表達式的類型
      • 9.2.定義BRE模式
        • 9.2.1.普通文本
        • 9.2.2.特殊字符
      • 9.2.3.錨點字符
        • 錨定行首^
        • 錨定行尾$
        • 組合錨點
      • 9.2.4.點號字符\.
      • 9.2.5.字符組[]
      • 9.2.6.排除字符組
      • 8.2.7.區間
      • 9.2.8.特殊字符組
      • 9.2.9.星號*
    • 9.3.擴展正則表達式
      • 9.3.1.問號?
      • 9.3.2.加號+
      • 9.3.3.花括號\{\}
      • 9.3.4.豎線符號\|
      • 9.3.5.表達式分組
    • 9.4.實戰
      • 9.4.1.目錄文件計數


九.正則表達式

  • 正則表達式基礎
  • 定義BRE模式
  • 擴展正則表達式

在sed和gawk中創建正則表達式,以得到所需的數據。

9.1.正則表達式基礎

正則表達式是一種可供Linux工具過濾文本的自定義模板,使用元字符來描述數據流中的一個或多個字符.
Linux工具(比如sed或gawk)會在讀取數據時使用正則表達式對數據進行模式匹配。如果數據匹配模式,它就會被接受并進行處理。
正則表達式包含文本和/或特殊字符.

9.1.1.正則表達式的類型

不同的應用程序可能使用不同類型的正則表達式。
編程語言(Java、Python)、Linux工具(sed、gawk和grep)以及主流應用程序(MySQL數據庫服務器)。

正則表達式由正則表達式引擎實現。這種底層軟件,負責解釋正則表達式并用這些模式進行文本匹配。

Linux 中流行的兩種:

  • POSIX基礎正則表達式(basic regular expression,BRE)引擎。
  • POSIX擴展正則表達式(extended regular expression,ERE)引擎。

大多數Linux工具至少符合POSIX BRE引擎規范。但有些工具(比如sed)僅符合BRE引擎規范的一個子集。
(出于速度方面的考慮導致,sed希望盡可能快地處理數據流中的文本)

POSIX ERE引擎多見于依賴正則表達式過濾文本的編程語言中。為常見模式(比如數字、單詞以及字母或數字字符)提供了高級模式符號和特殊符號。
gawk就是使用ERE引擎來處理正則表達式。

9.2.定義BRE模式

最基本的BRE模式是匹配數據流中的文本字符.

9.2.1.普通文本

正則表達式對大小寫敏感.
正則表達式并不關心模式在數據流中出現的位置,也不在意模式出現了多少次。
只要能匹配文本字符串中任意位置的模式,正則表達式就會將該字符串傳回Linux工具。

在正則表達式中,空格和其他的字符沒有區別.如果在正則表達式中定義了空格,那么必須出現在數據流中。甚至可以創建匹配多個連續空格的正則表達式.

$ cat data1
This is a normal line of text.
This is  a line with too many spaces.
$ sed -n '/  /p' data1
This is  a line with too many spaces.

9.2.2.特殊字符

正則表達式中的一些字符具有特別的含義:

  • .
  • *
  • []
  • ^
  • $
  • {}
  • \
  • +
  • ?
  • |
  • ()

不能在匹配普通文本的模式中單獨使用這些字符.
如果要將某個特殊字符視為普通字符,則必須將其轉義.使用特殊轉移字符反斜線(\)。

盡管正斜線 / 不屬于正則表達式的特殊字符,但如果出現在sed或gawk的正則表達式中,就會出現錯誤,所以正斜線也需要進行轉義.

9.2.3.錨點字符

默認情況下,當指定一個正則表達式模式時,只要模式出現在數據流中的任何地方,它就能匹配.有兩個特殊字符可以用來將模式鎖定在數據流中的行首或行尾。

錨定行首^

脫字符(^)可以指定位于數據流中文本行行首的模式。如果模式出現在行首之外的位置,則正則表達式無法匹配。
使用脫字符,就必須將其置于正則表達式之前

$ echo "The book store" | sed -n '/^book/p'
$
$ echo "Books are great" | sed -n '/^Book/p'
Books are great

如果將脫字符放到正則表達式開頭之外的位置,那么就跟普通字符一樣,沒有特殊含義

$ echo "This ^ is a test" | sed -n '/s ^/p'
This ^ is a test

如果正則表達式模式中只有脫字符,就不必用反斜線來轉義。但如果在正則表達式中先指定脫字符,隨后還有其他文本,就必須在脫字符前用轉義字符.

$ echo "This is ^ a test" | sed -n '/^ a test/p'
$ echo "This is ^ a test" | sed -n '/\^ a test/p'
This is ^ a test

錨定行尾$

與在行首查找模式相反的情況是在行尾查找。特殊字符美元符號($)定義了行尾錨點。將這個特殊字符放在正則表達式之后則表示數據行必須以該模式結尾.

$ echo "This is a good book" | sed -n '/book$/p'
This is a good book

組合錨點

組合使用行首錨點和行尾錨點。

$ cat data4
this is a test of using both anchors
I said this is a test
this is a test
I'm sure this is a test.
$ sed -n '/^this is a test$/p' data4
this is a test

將這兩個錨點直接組合,之間不加任何文本,可以過濾掉數據流中的空行。
組合 刪除命令d就可以刪除掉文本中的空行.

$ cat data5
This is one test line.This is another test line.
$ sed '/^$/d' data5
This is one test line.
This is another test line.

9.2.4.點號字符.

點號字符可以匹配除換行符之外的任意單個字符。(空格也是字符,可以匹配)
點號字符必須匹配一個字符,如果在點號字符的位置沒有可匹配的字符,那么模式不成立。

$ cat data6
This is a test of a line.
The cat is sleeping.
That is a very nice hat.
This test is at line four.
at ten o'clock we'll go home.
$ sed -n '/.at/p' data6
The cat is sleeping.
That is a very nice hat.
This test is at line four.

9.2.5.字符組[]

想要限定要匹配的具體字符使用字符組.
可以在正則表達式中定義用來匹配某個位置的一組字符。如果字符組中的某個字符出現在了數據流中,那就能匹配該模式。

方括號 [] 用于定義字符組。
在不太確定某個字符的大小寫時非常適合使用字符組.

$ echo "Yes" | sed -n '/[Yy]es/p'
Yes
$ echo "yes" | sed -n '/[Yy]es/p'
yes

在一個正則表達式中可以使用多個字符組.
可以將多個字符組組合在一起,以檢查數字是否具備正確的格式.

$ cat data8
60633
46201
223001
4353
22203
$ sed -n '
> /^[0123456789][0123456789][0123456789][0123456789][0123456789]$/p
> ' data8
60633
46201
22203

9.2.6.排除字符組

在正則表達式中,可以反轉字符組的作用:匹配字符組中沒有的字符。在字符組的開頭添加脫字符^:

$ sed -n '/[^ch]at/p' data6
This test is at line four.

即使是排除型,字符組仍必須匹配一個字符,以at為起始的行還是不能匹配模式!!!

8.2.7.區間

可以用單連字符在字符組中表示字符區間。只需指定區間的第一個字符、連字符以及區間的最后一個字符。
根據Linux系統使用的字符集,字符組會包括在此區間內的任意字符。

$ sed -n '/^[0-9][0-9][0-9][0-9][0-9]$/p' data8
60633
46201
45902

同樣的方法也適用于字母:

$ sed -n '/[c-h]at/p' data6
The cat is sleeping.
That is a very nice hat.

可以在單個字符組內指定多個不連續的區間:

$ sed -n '/[a-ch-m]at/p' data6
The cat is sleeping.
That is a very nice hat.

9.2.8.特殊字符組

BRE還提供了一些特殊的字符組,用來匹配特定類型的字符。

字符組描述
[[:alpha:]]匹配任意字母字符,無論大小寫
[[:alnum:]]匹配任意字母和數組字符,0-9、a-z、A-Z
[[:blank:]]匹配空格和制表符
[[:digit:]]匹配0-9的數字
[[:lower:]]匹配a-z的字母
[[:upper:]]匹配A-Z的字母
[[:print:]]匹配任意可打印字符
[[:punct:]]匹配標點符號
[[:space:]]匹配任意空白字符:空格、制表符、換行符、分頁符、垂直制表符、回車符

特殊字符組在正則表達式中的用法和普通字符組一樣:

$ echo "abc" | sed -n '/[[:digit:]]/p'
$ echo "abc" | sed -n '/[[:alpha:]]/p'
abc
$ echo "abc123" | sed -n '/[[:digit:]]/p'
abc123
$ echo "This is a test" | sed -n '/[[:punct:]]/p'
$ echo "This is, a test" | sed -n '/[[:punct:]]/p'
This is, a test

9.2.9.星號*

在字符后面放置星號,表明該字符必須在匹配模式的文本中出現0次或多次.

$ echo "ik" | sed -n '/ie*k/p'
ik
$ echo "iek" | sed -n '/ie*k/p'
iek
$ echo "ieek" | sed -n '/ie*k/p'
ieek
$ echo "ieeek" | sed -n '/ie*k/p'
ieeek
$ echo "ieeeek" | sed -n '/ie*k/p'
ieeeek

某些單詞在英美中不同,借助 星號可以匹配:

$ echo "I'm getting a color TV" | sed -n '/colou*r/p'
I'm getting a color TV
$ echo "I'm getting a colour TV" | sed -n '/colou*r/p'
I'm getting a colour TV
$

將點號字符和星號字符組合起來。這個組合能夠匹配任意數量的任意字符:

$ echo "this is a regular pattern expression" | sed -n '
> /regular.*expression/p'
this is a regular pattern expression

星號用于字符組時,指定可能在文本中出現0次或多次的字符組或字符區間:

$ echo "bt" | sed -n '/b[ae]*t/p'
bt
baaeeet
$ echo "baeeaeeat" | sed -n '/b[ae]*t/p'
baeeaeeat
$ echo "baakeeet" | sed -n '/b[ae]*t/p'

9.3.擴展正則表達式

POSIX ERE模式提供了一些可供Linux應用程序和工具使用的額外符號。gawk支持ERE模式,sed不支持。

可用于gawk腳本中的常見ERE模式符號。

9.3.1.問號?

問號表明字符可以出現0次或1次,不會匹配多次出現的該字符.用法與星號類似,可以作用與字符組.

$ echo "bt" | gawk '/be?t/{print $0}'
bt
$ echo "bet" | gawk '/be?t/{print $0}'
bet
$ echo "beet" | gawk '/be?t/{print $0}'

9.3.2.加號+

加號表明前面的字符可以出現1次或多次,必須至少出現1次。用法與星號類似,可以作用與字符組.

$ echo "bt" | gawk '/b[ae]+t/{print $0}'
$
$ echo "bat" | gawk '/b[ae]+t/{print $0}'
bat
$ echo "bet" | gawk '/b[ae]+t/{print $0}'
bet
$ echo "beat" | gawk '/b[ae]+t/{print $0}'
beat
$ echo "beet" | gawk '/b[ae]+t/{print $0}'
beet
$ echo "beeat" | gawk '/b[ae]+t/{print $0}'
beeat

9.3.3.花括號{}

ERE中的花括號允許為正則表達式指定具體的可重復次數,稱為區間。

可以用兩種格式來指定區間:

  • m:正則表達式恰好出現m次。
  • m, n:正則表達式至少出現m次,至多出現n次。

默認情況下,gawk也不識別正則表達式區間,必須指定gawk的命令行選項–re-interval。

$ echo "bt" | gawk --re-interval '/be{1}t/{print $0}'
$
$ echo "bet" | gawk --re-interval '/be{1}t/{print $0}'
bet
$ echo "beet" | gawk --re-interval '/be{1}t/{print $0}'
$
$ echo "bt" | gawk --re-interval '/be{1,2}t/{print $0}'
$
$ echo "bet" | gawk --re-interval '/be{1,2}t/{print $0}'
bet
$ echo "beet" | gawk --re-interval '/be{1,2}t/{print $0}'
beet
$ echo "beeet" | gawk --re-interval '/be{1,2}t/{print $0}'
$
$ echo "bt" | gawk --re-interval '/b[ae]{1,2}t/{print $0}'
$
$ echo "beet" | gawk --re-interval '/b[ae]{1,2}t/{print $0}'
beet
$ echo "beeat" | gawk --re-interval '/b[ae]{1,2}t/{print $0}'
$

9.3.4.豎線符號|

豎線符號允許在檢查數據流時,以邏輯OR方式指定正則表達式引擎要使用的兩個或多個模式。任何一個模式匹配了數據流文本,就視為匹配。
豎線符號兩側的子表達式可以采用正則表達式可用的任何模式符號(包括字符組)

$ echo "The cat is asleep" | gawk '/cat|dog/{print $0}'
The cat is asleep
$ echo "The dog is asleep" | gawk '/cat|dog/{print $0}'
The dog is asleep
$ echo "The sheep is asleep" | gawk '/cat|dog/{print $0}'

9.3.5.表達式分組

用圓括號對正則表達式進行分組。分組之后,每一組會被視為一個整體,可以像對普通字符一樣對該組應用特殊字符。

$ echo "Sat" | gawk '/Sat(urday)+/{print $0}'
$ echo "Saturday" | gawk '/Sat(urday)+/{print $0}'
Saturday

將分組和豎線符號結合起來創建可選的模式匹配組:

$ echo "cat" | gawk '/(c|b)a(b|t)/{print $0}'
cat
$ echo "cab" | gawk '/(c|b)a(b|t)/{print $0}'
cab
$ echo "bat" | gawk '/(c|b)a(b|t)/{print $0}'
bat
$ echo "bab" | gawk '/(c|b)a(b|t)/{print $0}'
bab
$ echo "tab" | gawk '/(c|b)a(b|t)/{print $0}'
$

9.4.實戰

9.4.1.目錄文件計數

對PATH環境變量中各個目錄所包含的文件數量進行統計.

PATH中的各個路徑由冒號分隔。要獲取可在腳本中使用的目錄列表,須用空格替換冒號.

$ echo $PATH | sed 's/:/ /g'
/usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin
/usr/games /usr/local/games

分離出目錄之后,可以使用標準for語句遍歷每個目錄:

mypath=`echo $PATH | sed 's/:/ /g'`
for directory in $mypath
do
...
done

對于單個目錄,可以用ls命令列出其中的文件,再用另一個for語句來遍歷每個文件,對文件計數器增值。

$ cat countfiles
#!/bin/bash
# count number of files in your PATH
mypath=$(echo $PATH | sed 's/:/ /g')
count=0
for directory in $mypath
docheck=$(ls $directory)for item in $checkdocount=$[ $count + 1 ]doneecho "$directory - $count"count=0
done
$ ./countfiles /usr/local/sbin - 0
/usr/local/bin - 2
/usr/sbin - 213
/usr/bin - 1427
...
/usr/local/games - 0

在這里插入圖片描述

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

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

相關文章

funbox3靶場滲透筆記

funbox3靶場滲透筆記 靶機地址 https://download.vulnhub.com/funbox/Funbox3.ova 信息收集 fscan找主機ip192.168.177.199 .\fscan64.exe -h 192.168.177.0/24___ _/ _ \ ___ ___ _ __ __ _ ___| | __/ /_\/____/ __|/ __| __/ _ |/ …

SpringBoot復習(39)Servlet容器的自動配置原理

Servlet容器自動配置類為ServletWebServerFactoryAutoConfiguration 可以看到通過Import注解導入了三個配置類: 通過這個這三個配置類可以看出,它們都使用了ConditionalOnClass注解,當類路徑存在tomcat相關的類時,會配置一個T…

【數據結構?堆】序列和的前n小元素

題目描述 問題&#xff1a;序列和的前n小元素   給出兩個長度為n的有序表A和B, 在A和B中各任取一個, 可以得到 n^2 個和. 求這些和最小的n個。 輸入輸出格式 輸入格式&#xff1a; 輸入數據共三行。   第一行&#xff0c;一個整數值n &#xff08; n < 10^4 &#xff…

Linux系列:從0到1用Docker部署springboot項目

目錄 1.前提條件 2.編寫DockerFile鏡像文件 3.打包SpringBoot項目 4.通過軟件Xftp進行傳輸&#xff08;*&#xff09; 1.點擊“文件-新建”?編輯 5.操作遠程主機 1.docker構建 2.容器運行 6.容器的關閉和刪除 1.前提條件 Linux、docker、xftp的安裝、一臺可以訪問的遠…

教雅川學纏論07-中樞實戰眾泰汽車000980

本文實戰眾泰汽車 下面是2023年11月14-2023年8月8眾泰汽車日K圖 先畫日K 接下來處理包含&#xff0c;就變成下面這個樣子 下面在套上纏論的理論&#xff0c;未來股價的走勢應該是紅色橢圓形虛線里面的樣子 好了&#xff0c;文章就到這里&#xff0c;如果眾泰最終不是這個走勢…

linux 目錄操作命令

目錄操作命令 文件列表 ls命令文件列表 ls [選項] [參數]-------------------------------l 詳細信息-L 緊接著符號性連接&#xff0c;列出它們指向的文件-a 所有文件&#xff0c;包含隱藏文件(以點號起始的文件)-A 與-a相同&#xff0c;但是不會列出來. 和 ..-c 根據創建時間排…

IDEA部署配置Maven項目教程,IDEA配置Tomcat(2019.3.3)

一、前言 當涉及到軟件開發和項目管理時&#xff0c;使用一個可靠的構建工具是非常重要的。Maven是一個廣泛使用的構建工具&#xff0c;它為Java項目提供了一種簡化的構建過程和依賴管理。 在本文中&#xff0c;我們將探討如何部署Maven并開始使用它來構建您的項目。我們將介紹…

Java基礎篇--淺拷貝和深拷貝

概念 淺拷貝&#xff08;Shallow Copy&#xff09;和深拷貝&#xff08;Deep Copy&#xff09;是在對象復制過程中常用的概念。 淺拷貝是指創建一個新對象&#xff0c;并將原始對象的非靜態字段的值拷貝到新對象中。如果字段是基本數據類型&#xff0c;直接復制其值&#xf…

開源數據庫Mysql_DBA運維實戰 (修改root密碼)

MySQL——修改root密碼的4種方法 本文以windows為例為大家詳細介紹下MySQL修改root密碼的4種方法&#xff0c;大家可以可以根據的自己的情況自由選擇&#xff0c;希望對大家有所幫助 方法1&#xff1a; 用SET PASSWORD命令 首先登錄MySQL。 格式&#xff1a;mysql> set pass…

Android APK體積優化(瘦身)

1、基礎知識&#xff1a; 1.1 apk結構 lib &#xff1a;存放so文件&#xff0c;對應不同的cpu架構 res &#xff1a;資源文件&#xff0c;layout、drawable等&#xff0c;經過aapt編譯 assets &#xff1a;資源文件&#xff0c;不經過aapt編譯 classes.dex &#xff1a;dx編譯…

爬蟲:使用Selenium模擬人工操作及獲取網頁內容

專欄介紹 結合自身經驗和內部資料總結的Python教程,每天3-5章,最短1個月就能全方位的完成Python的學習并進行實戰開發,學完了定能成為大佬!加油吧!卷起來! 全部文章請訪問專欄:《Python全棧教程(0基礎)》 再推薦一下最近熱更的:《大廠測試高頻面試題詳解》 該專欄對…

graphab 教程 ——生成廊道

Graphab軟件包括圖譜創建、基于圖譜的連通性計算、分析與推廣、制圖四個模塊。Graphab軟件的圖譜創建基于柵格數據進行,包括斑塊識別和連接建立兩個步驟。Graphab 軟件可識別的柵格數據格式包括TIFF、ASCI和RST,柵格像元記錄數值用于識別斑塊類型,識別規則可以選擇四鄰域或八鄰…

2-redis單節點搭建安裝

1.系統要求 本次redis四種模式(單機(standalone)模式、主從(master-slave)模式、哨兵(sentinel)模式、集群(cluster)模式)的搭建,以CentOS服務器進行。 類型版本CentOS7.9Redis7.0.121.1.OS基礎配置 CentOS為了能夠正常安裝redis,需要對CentOS進行常規的一些基礎配置,主要…

【Zabbix安裝-5.5版本】

Zabbix安裝&#xff08;rpm包安裝&#xff09; Index of /zabbix/zabbix/5.5/rhel/8/x86_64/ | 清華大學開源軟件鏡像站 | Tsinghua Open Source Mirror rpm包鏈接&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/zabbix/zabbix/5.5/rhel/8/x86_64/zabbix-release-5.5-1.e…

Unity3d C#利用本地網頁快速打開螢石云監控視頻流(ezopen)實現云臺,聲音等控制,支持WebGL平臺,替代UMP播放(含源碼)

前言 之前我介紹了替代Universal?Media?PlayerUMP播放石云監控視頻流(ezopen)的功能&#xff0c;效果還是很明顯的&#xff0c;筆者的測試是差不多3-5秒就能打開監控畫面&#xff0c;不過稍微遺憾的是&#xff0c;之前的功能是iframe打開石云提供的播放網頁的形式&#xff0…

詳解攔截器和過濾器

目錄 代碼演示過濾器Demo攔截器Demo 過濾器自定義攔截器配置攔截器過濾器執行原理多個過濾器的執行順序 攔截器自定義攔截器注冊攔截器1&#xff09;注冊攔截器2&#xff09;配置攔截的路徑3&#xff09;配置不攔截的路徑 多個攔截器的執行順序 過濾器和攔截器的區別 代碼演示 …

HarmonyOS教育類APP項目實戰系列課結課考試答案(1-10講)80分就合格

王丹輝&#xff08;第一講&#xff09;&#xff1a;HarmonyOS教育類APP項目實戰開課及低代碼初體驗 結課考試 及格分80/ 滿分100 評價 判斷題 1. DevEco Studio不能同時支持HarmonyOS和OpenHarmony應用/服務開發 正確(True)錯誤(False) 回答正確 2. DevEco Studio…

C#基礎知識(一)

一、C#程序結構 《1》命名空間的聲明&#xff08;namespace declaration&#xff09; 《2》一個class 《3》class方法 《4》class屬性 《5》一個main方法 《6》語句&#xff08;statements&#xff09;&表達式&#xff08;Expressions&#xff09; 《7》注釋 注&#xff1a…

【設計模式】橋接模式

橋接&#xff08;Bridge&#xff09;是用于把抽象化與實現化解耦&#xff0c;使得二者可以獨立變化。這種類型的設計模式屬于結構型模式&#xff0c;它通過提供抽象化和實現化之間的橋接結構&#xff0c;來實現二者的解耦。 這種模式涉及到一個作為橋接的接口&#xff0c;使得…

C++ 網絡編程項目fastDFS分布式文件系統(二)-redis部分

目錄 1. 數據庫類型 1.1 基本概念 1.2 關系/非關系型數據庫搭配使用 2. Redis 2.1 基本知識點 2.2 redis常用命令 - String類型 - List類型 - Set類型 - SortedSet 類型 - Hash類型 Key 相關的命令 2.3 redis配置文件 2.4 redis數據持久化 3 hiredis的使用 1. 數據…