shell正則表達式

一、shell正則表達式的概述:
正則表達式是一種定義的,用於描述字符排列和匹配模式的一種語法規則,linux系統中的文本處理工具可以藉助shell正則表達式處理文本文檔。

二、shell正則表達式的分類:

  • 字符類
  • 數量限定符
  • 位置限定符

字符類:

元字符 功能 舉例
. 匹配除了換行符之外的任意一個字符 #egrep a.b 文件名;表示匹配文件中a跟b之間有一個任意字符的行;
- 在括號中使用,表示匹配的字符的範圍 [0-9]表示的就是從數字0到數字9這個範圍的數字;
[ ] 匹配括號中的任意一個字符 #egrep [0-9] 文件名;表示匹配文件中含有0-9任意一個數字的行;
[[:xxx:]] grep工具預定義的一些命名字符 [[:digit:]]表示匹配一個數字[0-9],[[:alpha:]表示匹配一個英文字母[a-Z]

數量限定符:

元字符 功能 舉例
? 緊跟在它前面的單元應匹配零次或者一次 ,是通配符的一種,等價於(0,1)
+ 緊跟在它前面的單元應匹配一次或者多次(至少一次),等價於(1,)
* 緊跟在它前面的單元匹配零次或者多次,是通配符的一種 “a”:表示匹配所有內容,包括空行;“aa”:表示匹配至少含有一個a的行;“aaa”:表示匹配至少含有兩個a的行;
{n} 緊跟在它前面的單元應匹配n次 [0-9]{4}:表示匹配4位數字;
{n,} 緊跟在它前面的單元應匹配至少n次 [0-9]{3,}:表示匹配至少匹配3位數字;
{,m} 緊跟在它前面的單元應匹配最多m次 [0-9]{,2}:表示匹配數字最多2位
{n,m} 緊跟在它前面的單元應匹配至少n次,最多m次 [0-9]{1,3}:表示匹配數字至少1位,最多3位;

位置限定符:

元字符 功能 舉例
^ 匹配行首的位置;a.位於[ ]括號內,則匹配除括號中字符之外的任意字符,也就是對[ ]括號內的字符取反;b.位於[ ]括號外面,則表示以[ ]中的任意一個字符開頭 ^a:表示匹配文件中以a開頭的行;[ ^0-9]:表示匹配任意一位非數字字符;
$ 匹配行尾的位置 “a$”:表示匹配以a結尾的行;

其他特殊字符:

元字符 功能 舉例
\ 轉義符,可以將普通字符轉爲特殊字符,將特殊字符轉爲普通字符,大多時候是用在將特殊字符的含義取消 ".$“如果前面沒有加轉義符,則表示匹配以任意一個字符結尾的行,加上轉義字符之後表示匹配以”."結尾的行,也就是把“.“的特殊含義取消了,變成普通的”.”符號;
() 小括號可以將正則表達式的一部分括起來組成一個單元,可以對整個單元使用數量限定符 ([a-z]-[0-9]){1,3}:表示匹配”字母-數字“這樣的格式的組合三次
在這裏插入圖片描述 連接兩個子表達式,表示或的關係 在這裏插入圖片描述

表示集合的字符類描述:

字符 描述
[:alnum:] 表示所有字母數字的集合,[a-z A-Z 0-9]
[:alpha:] 表示所有字母的集合,[a-z A-Z]
[:digit:] 表示所有數字,[0-9]
[:lower:] 表示所有的小寫字母的集合,小寫[a-z]
[:upper:] 表示所有大寫字母的集合,大寫[A-Z]
[:space:] 表示空格
[:blank:] 表示所有空格或者製表鍵(tab鍵)的集合
[:punct:] 表示所有的標點字符
[:cntrl:] 表示所有的控制字符
[:print:] 表示所有的非控制字符
[:graph:] 表示所有可視,可打印的字符(不包含空格)
[:xdigit:] 表示所有十六進制的數字的集合,[0-9 a-f A-F]

儘量使用表示集合類的字符是很有利的,因爲它們可以使我們的腳本更加簡潔,美觀;

shell正則表達式的應用實例:
原文件內容:
在這裏插入圖片描述
注:grep的常用選項:

-E:使grep支持擴展正則表達式,擴展選項爲正則表達式,grep -E相當於egrep
-n:顯示匹配的行的行號
-q:安靜模式,也就是靜默輸出,不打印任何標準輸出,如果有匹配的內容則立即返回狀態值0
-v:取反
-w:用於精確匹配
-R:搜索子目錄
-i:不區分大小寫針對單個字符
-o:只打印匹配到的字符
-c:顯示有多少行被匹配到

一、基本應用實例

1.過濾出a後面跟有任意一個字符的行:
在這裏插入圖片描述
2.過濾出a後面跟有任意多個a(包括0個)的行:
在這裏插入圖片描述
3.過濾出至少出現一次a的行:
在這裏插入圖片描述
4.過濾出a後面跟有0個a或者1個a的行:
在這裏插入圖片描述
5.找出a後面跟有2個a的行:
在這裏插入圖片描述
6.找出a後面跟有最少一個a,最多兩個a的行:
在這裏插入圖片描述
7.找出行首爲aa的行:
在這裏插入圖片描述
8.匹配文件中所有非數字的字符(紅色的爲非數字字符):
在這裏插入圖片描述
9.找出行尾爲11的行:
在這裏插入圖片描述

二、綜合應用實例
1.找出文件中的所有ip地址:
參考方法:

第一種方法:
在這裏插入圖片描述
參考解釋:[0-9]表示從0-9的數字中取一個數字,{1,3}表示[0-9]要匹配出最少一個數字,最多三個數字,在”.”的前面加上轉義符”\“可以使特殊符號”.“成爲普通的”.“符號,也就是上圖要找的格式爲ip地址,^表示以這個格式開頭,$表示以這個格式結尾,也就是表示一行只有一個ip纔會匹配出來;

第二種方法:
在這裏插入圖片描述
**參考解釋:**跟第一種方法唯一不同的地方就是用()將”[0-9]{1,3}.“括起來組成一個單元,然後再用數量限定符給他們指定匹配的次數,“([0-9]{1,3}.){1,3}”與”[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.“效果等同

第三種方法:
在這裏插入圖片描述
**參考解釋:**第一種方法跟第三種方法唯一不同的是第三種方法用的是數字的集合匹配,[:digit:]相當於[0-9],其他的是一樣的;

第四種方法:
在這裏插入圖片描述
**參考解釋:**第四種方法跟第二種方法唯一不同的是第四種方法使用的是數字集合的匹配,其餘的一樣;

以上的四種方法都可以將”grep -En“改爲”egrep -n“去執行

2.顯示ifconfig命令結果中的ip地址,以eth0網卡爲例:
在這裏插入圖片描述
也可以這樣:
在這裏插入圖片描述
**參考解釋:**用ifconfig命令輸出eth0網卡信息,管道給grep工具處理精確匹配出含有”inet“的行,得到的結果管道給egrep處理匹配出含有ip地址的行,然後再管道給head命令輸出第一行;

3.寫一個簡單的腳本,輸入當前的日期,然後判斷輸入的格式是否正確:

[root@ceshi ~]vim time.sh
#!/bin/bash
read -p "請輸入今天的日期,格式爲”xxxx-xx-xx:" time
##判斷參數
if [ -z ${time} ];then
	echo "請您重新運行腳本,並且輸入時間,格式爲"xxxx-xx-xx"
	exit 1
fi

if [ -n ${time} ];then
	echo ${time} | egrep -q [[:alpha:]]
	if [ $? -eq 0 ];then
		echo "您輸入的信息中包含英文字母,請您重新運行腳本,並且輸入純數字格式的日期"
		exit 2
	else
		echo ${time} | egrep -q [[:digit:]]{4}-[[:digit:]]{2}-[[:digit:]]{2}
		if [ $? -eq 0 ];then
			echo "輸入日期格式CORRECT"
		else
			echo "輸入日期格式FAIL"
		fi
	fi
fi
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章