1. 程式人生 > 其它 >4月12日學習筆記,grep和正則表示式,擴充套件正則表示式

4月12日學習筆記,grep和正則表示式,擴充套件正則表示式

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

正則記憶表