鍍金池/ 教程/ Linux/ shell 學習第七天----基礎正則表達式 (BRE)
shell 學習四十一天----列出文件 ls 和 od 命令
shell 學習小結(jié)
shell 學習第二十八天----case 語句
shell 學習四十四天----尋找文件
shell 學習三十五天----波浪號展開與通配符
shell 學習三十八天----執(zhí)行順序和 eval
shell 學習四十八天----文件校驗和匹配
shell 學習四十天----awk 的驚人表現(xiàn)
shell 學習第十一天----sed 正則的精確控制
shell 學習第十七天----awk 命令
shell 學習三十九天----內(nèi)建命令
shell 學習四十五天----xargs
shell 學習三十七天----引用
shell 學習第十六天----join 練習
shell 學習第二十四天----提取開頭或結(jié)尾數(shù)行
shell 學習第九天----分組
shell 學習第五天----基本的 I/O 重定向
shell 學習第十五天----使用 cut 選定字段
shell 學習四十六天----文件系統(tǒng)的空間信息 df 和 du 命令
shell 學習第八天----擴展正則表達式 (ERE)
shell 學習第十九天----文本塊排序
shell 學習第二十一天----重新格式化段落
shell 學習三十六天----命令替換
shell 學習第二十天----sort 的其他內(nèi)容以及 uniq 命令
shell 學習四十二天----使用 touch 更新文件時間
shell 學習五十一天----top 命令查看進程列表
shell 學習第一天
shell 學習五十四天----進程系統(tǒng)調(diào)用的追蹤 strace
shell 學習五十天----查看進程 ps 命令
shell 學習第二十七天----退出狀態(tài)和 if 語句
shell 學習第二十三天----打印
shell 學習三十三天----關(guān)于重定向
shell 學習四十九天----進程建立
shell 學習第三十天----break,continue,shift,getopts
shell 學習五十五天----進程記賬
shell 學習總結(jié)一
shell 學習第二十六天----變量與算數(shù)
shell 學習第二十二天----計算行數(shù), 字數(shù)以及字符數(shù)
shell 學習五十八天----/proc 文件系統(tǒng)
shell 學習第二十五天----神器的管道符
shell 學習第三十二天----read 讀取一行
sheel 學習第三天
shell 學習----小結(jié)
shell 學習第十八天----文本排序
shell 學習第三十一天----函數(shù)問題
shell 學習第十天----sed 查找與替換
shell 學習四十三天----臨時性文件的建立與使用
shell 學習四十七天----文件比較 cmp,diff,patch
shell 學習三十四天----printf 詳解
shell 學習五十七天 ----linux 任務管理,針對上一講的總結(jié)和擴展
shell 學習第六天----小結(jié)
shell 學習第十三天----sed 案例分析
shell 學習第七天----基礎正則表達式 (BRE)
shell 學習第十二天----行與字符串
shell 學習小結(jié)四
shell 學習第二十九天----循環(huán)
shell 學習五十二天----刪除進程 kill 命令
shell 學習五十六天----延遲進程調(diào)度
shell 學習第四天----華麗的 printf 輸出
shell 學習第十五天----join 連接字段
shell 學習完結(jié)篇----希望你能看到
shell 學習第二天
shell 學習五十三天----捕獲信號 trap

shell 學習第七天----基礎正則表達式 (BRE)

查找文本

用到的關(guān)鍵字 grep,最簡單的用法就是使用固定字符串。

比如使用 who 命令查找當前多少人登陸系統(tǒng)

  • who |grep syx,就可以查看名字叫 syx 的用戶登錄于何處。
  • grep 的語法:
  • grep [options pattern-spec [files...]

用途: 顯示匹配一個或者多個模式的文本行。時常為作為管道的第一步,以便對匹配的數(shù)據(jù)進一步處理。

主要選項

  • -i: 模式匹配時忽略大小寫
  • -V: 顯示不匹配的行
  • -l: 列出匹配模式的文件名稱,而不是打印匹配的行
  • -n: 列出檢索目標所在的行號
  • -c: 統(tǒng)計匹配的行總數(shù),不顯示航信息

行為模式

讀取命令行上致命的每個文件,發(fā)現(xiàn)匹配查找迷失的行時,將它顯示出來,當指名多個文件時,grep 會在每一行前面加上文件名與一個冒號。

  • grep: 最常用,可以檢索目標 (一個活多個單詞或正則表達式)。
  • fgrep: 不能使用正則表達式,可以檢索多個目標,等同于 grep -f
  • egrep: 支持豐富的正則表達式,而且支持多目標檢索,等同于 grep -e。

一般情況下沒有使用 fgrep 的,我們也不建議使用。

說起文本檢索就不得不提到正則表達式,正則表達式十一中表示方法,可以查找匹配特定準則的文本。例如,查找以”a” 字母開頭的文本。茨表示法可以寫一個表達式,選定或匹配多個數(shù)據(jù)字符串。

從根本上來看,正則表達式是由兩個基本組成部分所建立:一般字符與特殊字符。一般字符指的是任何沒有特殊意義的字符。在某些情況下,特殊特殊字符也可以視為一般字符。特殊字符稱為元字符(metacharacter)。

  • BRE: 基本正則表達式(Basic Regular Expression)
  • ERE: 擴展的正則表達式(Extended Regular Expression)

先來看一些簡單的匹配返利

  • tolstoy: 匹配一行上任意位置的 7 個字母:tolstoy
  • ^tolstoy: 7 個字母 tolstoy,出現(xiàn)在一行的開頭
  • tolstoy$: 出現(xiàn)在一行的結(jié)尾
  • ^tolstoy$: 正好包含這 7 個字母的一行,沒有其他的任何字符。
  • [tT]olstoy: 在一行的任意位居中,含有 Tolstoy 或者 tolstoy
  • tol.toy: 在一行的任意位居中,含有 tol 這三個字母,加上一個特殊字符,在接著 toy 這三個字母
  • tol.*toy: 在一行的任意位居中,含有 tol 這三個字母,加上任意的 0 或者多個字符,再繼續(xù) toy 這三個字母 (例如:toltoy,tolstoy,tolWHOtoy 都是滿足要求的)。

shell 中的通配符: *: 代表 0 個或者多個任意字符 ?: 代表一定有一個的任意字符 []: 代表一定有一個在括號內(nèi)的字符 (非任意字符)。例如 [abcd] 代表一定有一個字符,可能是 abcd 這四個選項的任意一個。 [-]: 若郵件韓在括號內(nèi)時,代表在編碼順序內(nèi)的所有自負。例如:[0-9] 代表 0 到 9 之間的所有數(shù)字,因為數(shù)字的語系編碼是連續(xù)的。 [^]: 若括號內(nèi)的第一個字符為指數(shù)字符 (^),那表示反向選擇,例如:[^abc] 代表一定有一個字符,只要是非 abc 的其他字符就可以。

shell 中的特殊字符

  • #: 注釋字符
  • \: 將特殊字符或者通配符還原成一般字符
  • |: 管道符,分割兩個管線命令的界定
  • ;: 連續(xù)命令下達分隔符
  • ~: 用戶的家目錄
  • $: 放在變量前面,正確使用變量
  • &: 工作控制,將命令編程背景下工作
  • !: 非 (!) 的意思,邏輯運算符
  • ,>>: 輸出重定向,分別是覆蓋和追加

  • <,<<: 輸入重定向
  • ‘’: 單引號,不具有變量置換的功能
  • “”: 雙引號,具有變量置換的功能
  • (): 在中間的為子 shell 的起始與結(jié)束
  • {]: 在中間為命令塊的組合

shell 中正則表達式的控制字符

  • ^: 匹配行首位置
  • $: 匹配行尾位置
  • .: 匹配任意祖父
  • : 對 之前的匹配整體或字符匹配任意次 (包括 0 次)
  • \?: 對 \? 之前的匹配整體或字符匹配 0 次或 1 次
  • {n}: 對 \ { 之前的匹配整體或字符匹配 n 次
  • {m,}: 對 \ { 之前的匹配整體或字符匹配至少 m 次
  • {m,n}: 對 \ { 之前的匹配整體或字符匹配 m 到 n 次
  • [abcdef]: 對單字符而言匹配 [] 中的字符
  • [a-z]; 對單字符而言,匹配任意一個小寫字母

基本正則表達式

匹配單個字符

  1. 匹配一般字符: 一般字符是指無特殊含義的字符,包括所有文本和數(shù)字字符,絕大多數(shù)的空白字符以及標點符號字符,因此,正則 a,匹配 a。
  2. 如果相匹配 ,因為 是特殊字符,所以需要用 \ 轉(zhuǎn)義,正則 *,匹配 *。
  3. (點號) 字符意即” 任意字符”,例如 a.c 匹配于 abc,aac。
  4. 使用方括號表達式。例如 x[abcdefg]z,可以匹配 xaz,xbz,等,方括號里如果存在 (^),表示取反的意思,就是說不匹配列表里的任意字符。

[0123456789] 表示所數(shù)字,但是這樣寫太麻煩,我們可以用 [0-9] 來表示,[abcdefg] 同樣可以用 [a-g]

單個表達式匹配多字符

最簡單的辦法就是把它們一一列出來: 正則 abc 匹配于 abc。雖然 (.)meta 字符與方括號表達式都提供了依次匹配一個字符的很好方式,單正則真正強大而有力地功能是修飾符 meta 字符的使用上。最常用的修飾符是 (),表示匹配 0 個或多個前面的單個字符。因此 abc 表示” 匹配一個 a,0 個或多個 b 字符以及 a 空 c”。這個正則匹配的有 ac,abc,abbcabbbbc。匹配 0 或多個,不表示匹配其他的某一個。例如正則 ab*c,文本 aQc 是不匹配的。但是 ac 是匹配的。

  • (*) 修飾符雖然好用,但是他沒有限制,如要只要指定次數(shù),使用一個復雜的方括號表達式雖然也能指定次數(shù),但是太過麻煩。我們就引入了區(qū)間表達式。所謂的區(qū)間表達式有三種變化
  • {n} 前置正則表達式所得結(jié)果重現(xiàn) n 次
  • {n,} 前置正則表達式所得結(jié)果至少出現(xiàn) n 次
  • {n,m} 出現(xiàn) n 到 m 次

例如我們想要表達” 重現(xiàn) 5 個 a” =>a{5},” 重現(xiàn) 10 到 42 個 q”=>q{10,42};

文本匹配錨點

兩個 meta 字符是脫節(jié)符號 (^),與貨幣字符 (&),他們叫做錨點,因為其用途在限制正則表達式匹配時,針對要被匹配字符的開始或者結(jié)尾處進行匹配,假定有一串字符串:abcABCdefDEF

正則表達式錨點的范例

模式 是否匹配 理由
ABC 居中的 4,5,6 字符匹配
^ABC 起始處不是 ABC
def$ 結(jié)尾處不是 def
[[:upper:]]{3} 居中的大寫 ABC 匹配
[[:upper:]]{3}$ 結(jié)尾的大寫 DEF 匹配
^[[:alpha:]]{3} 起始處的 abc 匹配

^ 和 $ 當然能同時使用,這種情況將括起來的正則表達式匹配整個字符串 (或行)。有時 ^$ 這樣簡易的正則很好用,可以用來匹配空的字符串或行列。例如加上 grep -v 選項用來顯示所有不匹配模式的行們使用上面的做法,便能過濾掉文件里的空號。 ^$ 盡在起始與結(jié)尾具有特殊用處。例如 ab^cd 里的 ^ 表示的就是自身 (^)。

  • BRE 運算符喲普先機,由高到低
  • [..] [==] [::] 用于字符拍的方括號符號
  • \metacharacter 轉(zhuǎn)移的 meta 字符
  • [] 方括號表達式
  • {} 子表達式
    • {} 前置單個字符重現(xiàn)的正則表達式
  • 無符號 連續(xù)
  • ^$ 錨點