4月12日學習筆記,grep和正則表示式,擴充套件正則表示式
阿新 • • 發佈:2022-04-12
day28學習筆記(4月12日)
正則表示式和擴充套件正則表示式
萬用字元和正則的區別
1.從語法上就記住,只有awk、gre、sed才識別正則表示式符號、其他都是萬用字元
2.從用法上區分
- 表示式操作的是檔案、目錄名(屬於是萬用字元)
- 表示式操作的是檔案內容(正則表示式)
什麼是正則表示式
- 正則表示式就是為了處理大量的字串而定義的一套規則和方法。
- 通過定義的這些特殊符號的輔助,系統管理員就可以快速過濾,替換或輸出需要的字串。
- Linux 正則表示式一般以行為單位處理的。
如何用正則表示式
通常Linux運維工作,都是面臨大量帶有字串的內容,如
- 配置檔案
- 程式程式碼
- 命令輸出結果
- 日誌檔案
且此類字串內容,我們常會有特定的需要,查找出符合工作需要的特定的字串,因此正則表示式就出現了
- 正則表示式是一套規則和方法
- 正則工作時以單位進行,一次處理一行
- 正則表示式化繁為簡,提高工作效率
- linux僅受三劍客(sed、awk、grep)支援,其他命令無法使用
學正則的注意事項
- 正則表示式應用非常廣泛,很多程式語言都支援正則表示式,用於處理字串提取資料。
- Linux下普通命令無法使用正則表示式的,只能使用linux下的三個命令,結合正則表示式處理。
- sed
- grep
- awk
- 萬用字元是大部分普通命令都支援的,用於查詢檔案或目錄
- 而正則表示式是通過三劍客命令在檔案(資料流)中過濾內容的,注意區別
- 以及注意字符集,需要設定
LC_ALL=C
,注意這一點很重要
關於字符集設定
你會發現很多shell腳本里都有這麼一個語句如下
作用是修改linux的字符集,通過locale
命令可以檢視本地字符集設定
linux通過如下變數設定程式執行的不同語言環境,如中文、英文環境。
[root@yuchao-tx-server ~]# locale LANG=en_US.UTF-8 LC_CTYPE="zh_CN.UTF-8" LC_NUMERIC="zh_CN.UTF-8" LC_TIME="zh_CN.UTF-8" LC_COLLATE="zh_CN.UTF-8" LC_MONETARY="zh_CN.UTF-8" LC_MESSAGES="zh_CN.UTF-8" LC_PAPER="zh_CN.UTF-8" LC_NAME="zh_CN.UTF-8" LC_ADDRESS="zh_CN.UTF-8" LC_TELEPHONE="zh_CN.UTF-8" LC_MEASUREMENT="zh_CN.UTF-8" LC_IDENTIFICATION="zh_CN.UTF-8" LC_ALL=zh_CN.UTF-8
一般我們會使用$LANG
變數來設定linux的字符集,一般設定為我們所在的地區,如zh_CN.UTF-8
[root@yuchao-tx-server ~]# echo $LANG
en_US.UTF-8
為了讓系統能正確執行shell語句(由於自定義修改的不同語言環境,對一些特殊符號的處理區別,如中文輸入法,英文輸入法下的標點符號等,導致shell無法執行)
我們會使用如下語句,恢復linux的所有的本地化設定,恢復系統到初始化的語言環境。
[root@yuchao-tx-server ~]# export LC_ALL=C
正則表示式分類
使用正則表示式的問題是、有兩大類正則表示式規範、linux不同的應用程式,會使用不同的正則表示式。
例如
- 不同的程式語言使用正則(python,java)
- Linux實用工具(sed、awk、grep)
- 其他軟體使用正則(mysql、nginx)
正則表示式是通過正則表示式引擎(regular expression engine)實現的。正則表示式引擎是 一套底層軟體,負責解釋正則表示式模式並使用這些模式進行文字匹配。
在Linux中,有兩種流行的正則表示式引擎:
基於unix標準下的正則表示式符號規則有兩類:
POSIX基礎正則表示式(basic regular expression,BRE)引擎
POSIX擴充套件正則表示式(extended regular expression,ERE)引擎
解釋posix
POSIX(Portable Operating System Interface)是Unix系統的一個設計標準。
當年最早的Unix,原始碼流傳出去了,加上早期的Unix不夠完善,於是之後出現了好些獨立開發的與Unix基本相容但又不完全相容的OS,通稱Unix-like OS
兩類、正則表示式符號
linux規範將正則表示式分為了兩種
- 基本正則表示式(BRE、basic regular expression)
BRE對應元字元有
^ $ . [ ] *
其他符號是普通字元
; \
- 擴充套件正則表示式(ERE、extended regular expression)
ERE在在BRE基礎上,增加了
( ) { } ? + | 等元字元
- 轉義符
反斜槓 \
反斜槓用於在元字元前新增,使其成為普通字元
正則符號
字元 | 描述 | 示例 |
---|---|---|
\ | 轉義字元,將特殊符號進行轉義,忽略其特殊意義 |
a\.b 只匹配a.b 不能匹配acb |
^ | grep匹配最左側字元,表示匹配以什麼開頭 | ^yy,表示以yy開頭的行 |
$ | grep匹配行末 | yy$表示以yy結尾 |
^$ | 表示空行 | |
. | 匹配除了換行符意外的所有內容,字元+空格(不匹配換行符和空行) | ab. 能匹配abc,abd |
.$ | 匹配任意符號結尾的行 | |
* | 匹配前一個字元連續出現0次或n次,即匹配所有內容 | |
.* | 匹配任意內容的行,包括空行 | |
^.* | 匹配任意多個字元開頭的行,包括空行 | |
[ ] | 匹配括號內的字元或數字 | [abc],a或b或c |
擴充套件正則符號
字元 | 描述 | 示例 |
---|---|---|
+ | 前面字元出現1次或n次 | go+d 匹配結果可以是god,good,goood |
() | 建立一個字元組 | max(tri)?匹配max或maxtri |
? | 匹配前一項0次或1次 | go?d 匹配結果只能是god,good |
{n} | 匹配之前的項n次,n是可以為0的正整數 | [0-9]{3}匹配任意一個三位數,可以擴充套件為[0-9][0-9][0-9][0-9]
|
{n,} | 之前的項至少需要匹配N次 | [0-9]{2,}匹配任意一個兩位數或更多位數 |
{n,m} | 指定之前的項至少匹配n次,最多匹配m次,n<=m | [0-9]{2,5}匹配任意一個兩位數或者更多位數 |
| | 交替匹配兩邊任意一項 | ab(c|d),匹配abc或abd |