鍍金池/ 教程/ Linux/ shell 學(xué)習(xí)第七天---基礎(chǔ)正則表達(dá)式(BRE)
shell 學(xué)習(xí)四十五天---xargs
shell學(xué)習(xí)第三天
shell 學(xué)習(xí)十五天---join 連接字段
shell 學(xué)習(xí)第二天
shell 學(xué)習(xí)四十三天---臨時(shí)性文件的建立與使用
shell 學(xué)習(xí)第六天---小結(jié)
shell 學(xué)習(xí)三十三天---關(guān)于重定向
shell 學(xué)習(xí)二十九天---循環(huán)
shell 學(xué)習(xí)二十四天---提取開頭或結(jié)尾數(shù)行
shell 學(xué)習(xí)第十天---sed 查找與替換
shell 學(xué)習(xí)第十一天---sed 正則的精確控制
shell 學(xué)習(xí)三十天---break,continue,shift,getopts
shell 學(xué)習(xí)---小結(jié)
shell 學(xué)習(xí)三十一天---函數(shù)問題
shell 學(xué)習(xí)第四天---華麗的 printf 輸出
shell 學(xué)習(xí)三十五天---波浪號展開與通配符
shell 學(xué)習(xí)十九天---文本塊排序
shell 學(xué)習(xí)十二天---行與字符串
shell 學(xué)習(xí)二十一天---重新格式化段落
shell 學(xué)習(xí)十八天---文本排序
shell 學(xué)習(xí)十三天---sed 案例分析
shell 學(xué)習(xí)四十一天---列出文件 ls 和 od 命令
shell 學(xué)習(xí)十七天---awk 命令
shell 學(xué)習(xí)三十六天---命令替換
shell 學(xué)習(xí)十六天---join 練習(xí)
shell 學(xué)習(xí)三十二天---read 讀取一行
shell 學(xué)習(xí)二十二天---計(jì)算行數(shù),字?jǐn)?shù)以及字符數(shù)
shell 學(xué)習(xí)小總結(jié)---本章小結(jié)
shell 學(xué)習(xí)第八天---擴(kuò)展正則表達(dá)式(ERE)
shell 學(xué)習(xí)四十二天---使用 touch 更新文件時(shí)間
shell 學(xué)習(xí)二十八天---case 語句
shell 學(xué)習(xí)三十九天---內(nèi)建命令
shell 學(xué)習(xí)第一天
shell 學(xué)習(xí)三十四天---printf 詳解
shell 學(xué)習(xí)二十六天---變量與算數(shù)
shell 學(xué)習(xí)三十八天---執(zhí)行順序和 eval
shell 學(xué)習(xí)四十四天---尋找文件
shell 學(xué)習(xí)二十五天---神器的管道符
shell 學(xué)習(xí)十四天---使用 cut 選定字段
shell 學(xué)習(xí)第五天---基本的I/O重定向
shell 學(xué)習(xí)四十天---awk 的驚人表現(xiàn)
shell 學(xué)習(xí)二十天---sort 的其他內(nèi)容以及 uniq 命令
shell 學(xué)習(xí)二十三天---打印
shell 學(xué)習(xí)第九天---分組
shell 學(xué)習(xí)四十八天---文件校驗(yàn)和匹配
shell 學(xué)習(xí)二十七天---退出狀態(tài)和 if 語句
shell 學(xué)習(xí)四十七天---文件比較 cmp,diff,patch
shell 學(xué)習(xí)第七天---基礎(chǔ)正則表達(dá)式(BRE)
shell 學(xué)習(xí)四十六天---文件系統(tǒng)的空間信息 df 和 du 命令
shell 學(xué)習(xí)三十七天---引用
shell 學(xué)習(xí)小結(jié)

shell 學(xué)習(xí)第七天---基礎(chǔ)正則表達(dá)式(BRE)

查找文本

用到的關(guān)鍵字 grep,最簡單的用法就是使用固定字符串
比如使用who命令查找當(dāng)前多少人登陸系統(tǒng)
who |grep syx,就可以查看名字叫 syx 的用戶登錄于何處。
grep 的語法:
grep [options pattern-spec [files...]

用途:顯示匹配一個(gè)或者多個(gè)模式的文本行。時(shí)常為作為管道的第一步,以便對匹配的數(shù)據(jù)進(jìn)一步處理。
主要選項(xiàng)
-i:模式匹配時(shí)忽略大小寫
-V:顯示不匹配的行
-l:列出匹配模式的文件名稱,而不是打印匹配的行
-n:列出檢索目標(biāo)所在的行號
-c:統(tǒng)計(jì)匹配的行總數(shù),不顯示航信息

行為模式

讀取命令行上致命的每個(gè)文件,發(fā)現(xiàn)匹配查找迷失的行時(shí),將它顯示出來,當(dāng)指名多個(gè)文件時(shí),grep 會(huì)在每一行前面加上文件名與一個(gè)冒號。
grep:最常用,可以檢索目標(biāo)(一個(gè)活多個(gè)單詞或正則表達(dá)式)。
fgrep:不能使用正則表達(dá)式,可以檢索多個(gè)目標(biāo),等同于 grep -f
egrep:支持豐富的正則表達(dá)式,而且支持多目標(biāo)檢索,等同于 grep -e。

一般情況下沒有使用 fgrep 的,我們也不建議使用。
說起文本檢索就不得不提到正則表達(dá)式,正則表達(dá)式十一中表示方法,可以查找匹配特定準(zhǔn)則的文本。例如,查找以“a”字母開頭的文本。茨表示法可以寫一個(gè)表達(dá)式,選定或匹配多個(gè)數(shù)據(jù)字符串。

從根本上來看,正則表達(dá)式是由兩個(gè)基本組成部分所建立:一般字符與特殊字符。一般字符指的是任何沒有特殊意義的字符。在某些情況下,特殊特殊字符也可以視為一般字符。特殊字符稱為元字符(metacharacter)。
BRE:基本正則表達(dá)式(Basic Regular Expression)
ERE:擴(kuò)展的正則表達(dá)式(Extended Regular Expression)
先來看一些簡單的匹配返利
tolstoy:匹配一行上任意位置的 7 個(gè)字母:tolstoy
^tolstoy: 7 個(gè)字母 tolstoy,出現(xiàn)在一行的開頭
tolstoy$:出現(xiàn)在一行的結(jié)尾
^tolstoy$:正好包含這 7 個(gè)字母的一行,沒有其他的任何字符。
[tT]olstoy: 在一行的任意位居中,含有 Tolstoy 或者 tolstoy
tol.toy:在一行的任意位居中,含有 tol 這三個(gè)字母,加上一個(gè)特殊字符,在接著 toy 這三個(gè)字母
tol.*toy:在一行的任意位居中,含有 tol 這三個(gè)字母,加上任意的 0 或者多個(gè)字符,再繼續(xù) toy 這三個(gè)字母(例如:toltoy,tolstoy,tolWHOtoy 都是滿足要求的)。

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

shell中的特殊字符:
#:注釋字符
\:將特殊字符或者通配符還原成一般字符
|:管道符,分割兩個(gè)管線命令的界定
;:連續(xù)命令下達(dá)分隔符
~:用戶的家目錄
$:放在變量前面,正確使用變量
&:工作控制,將命令編程背景下工作
!:非(!)的意思,邏輯運(yùn)算符
>,>>:輸出重定向,分別是覆蓋和追加
<,<<:輸入重定向
‘’:單引號,不具有變量置換的功能
“”:雙引號,具有變量置換的功能
():在中間的為子 shell 的起始與結(jié)束
{]:在中間為命令塊的組合

shell 中正則表達(dá)式的控制字符
^:匹配行首位置
$:匹配行尾位置
.:匹配任意祖父
*:對*之前的匹配整體或字符匹配任意次(包括 0 次)
\?:對\?之前的匹配整體或字符匹配 0 次或 1 次
\{n\}: 對 \ { 之前的匹配整體或字符匹配 n 次
\{m,\}: 對 \ { 之前的匹配整體或字符匹配至少 m 次
\{m,n}: 對 \ { 之前的匹配整體或字符匹配 m 到 n 次
[abcdef]: 對單字符而言匹配[]中的字符
[a-z]: 對單字符而言,匹配任意一個(gè)小寫字母
[^a-z]:不匹配括號中的內(nèi)容

基本正則表達(dá)式

匹配單個(gè)字符

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

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

單個(gè)表達(dá)式匹配多字符

最簡單的辦法就是把它們一一列出來:正則 abc 匹配于 abc。
雖然(.)meta 字符與方括號表達(dá)式都提供了依次匹配一個(gè)字符的很好方式,單正則真正強(qiáng)大而有力地功能是修飾符 meta 字符的使用上。
最常用的修飾符是(),表示匹配 0 個(gè)或多個(gè)前面的單個(gè)字符。因此 abc 表示“匹配一個(gè) a,0 個(gè)或多個(gè) b 字符以及 a 空 c ”。這個(gè)正則匹配的有 ac,abc,abbcabbbbc。
匹配 0 或多個(gè),不表示匹配其他的某一個(gè)。例如正則 abc,文本 aQc 是不匹配的。但是 ac 是匹配的。
(
)修飾符雖然好用,但是他沒有限制,如要只要指定次數(shù),使用一個(gè)復(fù)雜的方括號表達(dá)式雖然也能指定次數(shù),但是太過麻煩。我們就引入了區(qū)間表達(dá)式。所謂的區(qū)間表達(dá)式有三種變化
\{n\} 前置正則表達(dá)式所得結(jié)果重現(xiàn) n 次
\{n,\} 前置正則表達(dá)式所得結(jié)果至少出現(xiàn) n 次
\{n,m\} 出現(xiàn) n 到 m 次
例如我們想要表達(dá)“重現(xiàn) 5 個(gè) a” =>a\{5\},“重現(xiàn) 10 到 42 個(gè) q ” =>q\{10,42\};

文本匹配錨點(diǎn)

兩個(gè) meta 字符是脫節(jié)符號(^),與貨幣字符(&),他們叫做錨點(diǎn),因?yàn)槠溆猛驹谙拗普齽t表達(dá)式匹配時(shí),針對要被匹配字符的開始或者結(jié)尾處進(jìn)行匹配,
假定有一串字符串:abcABCdefDEF
正則表達(dá)式錨點(diǎn)的范例

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

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

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