查找文本
用到的關(guān)鍵字 grep,最簡(jiǎn)單的用法就是使用固定字符串。
比如使用 who 命令查找當(dāng)前多少人登陸系統(tǒng)
- who |grep syx,就可以查看名字叫 syx 的用戶登錄于何處。
- grep 的語(yǔ)法:
- grep [options pattern-spec [files...]
用途: 顯示匹配一個(gè)或者多個(gè)模式的文本行。時(shí)常為作為管道的第一步,以便對(duì)匹配的數(shù)據(jù)進(jìn)一步處理。
主要選項(xiàng)
- -i: 模式匹配時(shí)忽略大小寫(xiě)
- -V: 顯示不匹配的行
- -l: 列出匹配模式的文件名稱,而不是打印匹配的行
- -n: 列出檢索目標(biāo)所在的行號(hào)
- -c: 統(tǒng)計(jì)匹配的行總數(shù),不顯示航信息
行為模式
讀取命令行上致命的每個(gè)文件,發(fā)現(xiàn)匹配查找迷失的行時(shí),將它顯示出來(lái),當(dāng)指名多個(gè)文件時(shí),grep 會(huì)在每一行前面加上文件名與一個(gè)冒號(hào)。
- grep: 最常用,可以檢索目標(biāo) (一個(gè)活多個(gè)單詞或正則表達(dá)式)。
- fgrep: 不能使用正則表達(dá)式,可以檢索多個(gè)目標(biāo),等同于 grep -f
- egrep: 支持豐富的正則表達(dá)式,而且支持多目標(biāo)檢索,等同于 grep -e。
一般情況下沒(méi)有使用 fgrep 的,我們也不建議使用。
說(shuō)起文本檢索就不得不提到正則表達(dá)式,正則表達(dá)式十一中表示方法,可以查找匹配特定準(zhǔn)則的文本。例如,查找以”a” 字母開(kāi)頭的文本。茨表示法可以寫(xiě)一個(gè)表達(dá)式,選定或匹配多個(gè)數(shù)據(jù)字符串。
從根本上來(lái)看,正則表達(dá)式是由兩個(gè)基本組成部分所建立:一般字符與特殊字符。一般字符指的是任何沒(méi)有特殊意義的字符。在某些情況下,特殊特殊字符也可以視為一般字符。特殊字符稱為元字符(metacharacter)。
- BRE: 基本正則表達(dá)式(Basic Regular Expression)
- ERE: 擴(kuò)展的正則表達(dá)式(Extended Regular Expression)
先來(lái)看一些簡(jiǎn)單的匹配返利
- tolstoy: 匹配一行上任意位置的 7 個(gè)字母:tolstoy
- ^tolstoy: 7 個(gè)字母 tolstoy,出現(xiàn)在一行的開(kāi)頭
- tolstoy$: 出現(xiàn)在一行的結(jié)尾
- ^tolstoy$: 正好包含這 7 個(gè)字母的一行,沒(méi)有其他的任何字符。
- [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è)在括號(hào)內(nèi)的字符 (非任意字符)。例如 [abcd] 代表一定有一個(gè)字符,可能是 abcd 這四個(gè)選項(xiàng)的任意一個(gè)。
[-]: 若郵件韓在括號(hào)內(nèi)時(shí),代表在編碼順序內(nèi)的所有自負(fù)。例如:[0-9] 代表 0 到 9 之間的所有數(shù)字,因?yàn)閿?shù)字的語(yǔ)系編碼是連續(xù)的。
[^]: 若括號(hào)內(nèi)的第一個(gè)字符為指數(shù)字符 (^),那表示反向選擇,例如:[^abc] 代表一定有一個(gè)字符,只要是非 abc 的其他字符就可以。
shell 中的特殊字符
- #: 注釋字符
- \: 將特殊字符或者通配符還原成一般字符
- |: 管道符,分割兩個(gè)管線命令的界定
- ;: 連續(xù)命令下達(dá)分隔符
- ~: 用戶的家目錄
- $: 放在變量前面,正確使用變量
- &: 工作控制,將命令編程背景下工作
- !: 非 (!) 的意思,邏輯運(yùn)算符
-
,>>: 輸出重定向,分別是覆蓋和追加
- <,<<: 輸入重定向
- ‘’: 單引號(hào),不具有變量置換的功能
- “”: 雙引號(hào),具有變量置換的功能
- (): 在中間的為子 shell 的起始與結(jié)束
- {]: 在中間為命令塊的組合
shell 中正則表達(dá)式的控制字符
- ^: 匹配行首位置
- $: 匹配行尾位置
- .: 匹配任意祖父
- : 對(duì) 之前的匹配整體或字符匹配任意次 (包括 0 次)
- \?: 對(duì) \? 之前的匹配整體或字符匹配 0 次或 1 次
- {n}: 對(duì) \ { 之前的匹配整體或字符匹配 n 次
- {m,}: 對(duì) \ { 之前的匹配整體或字符匹配至少 m 次
- {m,n}: 對(duì) \ { 之前的匹配整體或字符匹配 m 到 n 次
- [abcdef]: 對(duì)單字符而言匹配 [] 中的字符
- [a-z]; 對(duì)單字符而言,匹配任意一個(gè)小寫(xiě)字母
-
基本正則表達(dá)式
匹配單個(gè)字符
- 匹配一般字符: 一般字符是指無(wú)特殊含義的字符,包括所有文本和數(shù)字字符,絕大多數(shù)的空白字符以及標(biāo)點(diǎn)符號(hào)字符,因此,正則 a,匹配 a。
- 如果相匹配 ,因?yàn)? 是特殊字符,所以需要用 \ 轉(zhuǎn)義,正則 *,匹配 *。
- (點(diǎn)號(hào)) 字符意即” 任意字符”,例如 a.c 匹配于 abc,aac。
- 使用方括號(hào)表達(dá)式。例如 x[abcdefg]z,可以匹配 xaz,xbz,等,方括號(hào)里如果存在 (^),表示取反的意思,就是說(shuō)不匹配列表里的任意字符。
[0123456789] 表示所數(shù)字,但是這樣寫(xiě)太麻煩,我們可以用 [0-9] 來(lái)表示,[abcdefg] 同樣可以用 [a-g]
單個(gè)表達(dá)式匹配多字符
最簡(jiǎn)單的辦法就是把它們一一列出來(lái): 正則 abc 匹配于 abc。雖然 (.)meta 字符與方括號(hào)表達(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è)。例如正則 ab*c,文本 aQc 是不匹配的。但是 ac 是匹配的。
- (*) 修飾符雖然好用,但是他沒(méi)有限制,如要只要指定次數(shù),使用一個(gè)復(fù)雜的方括號(hào)表達(dá)式雖然也能指定次數(shù),但是太過(guò)麻煩。我們就引入了區(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é)符號(hào) (^),與貨幣字符 (&),他們叫做錨點(diǎn),因?yàn)槠溆猛驹谙拗普齽t表達(dá)式匹配時(shí),針對(duì)要被匹配字符的開(kāi)始或者結(jié)尾處進(jìn)行匹配,假定有一串字符串:abcABCdefDEF
正則表達(dá)式錨點(diǎn)的范例
| 模式 |
是否匹配 |
理由 |
| ABC |
是 |
居中的 4,5,6 字符匹配 |
| ^ABC |
否 |
起始處不是 ABC |
| def$ |
是 |
結(jié)尾處不是 def |
| [[:upper:]]{3} |
是 |
居中的大寫(xiě) ABC 匹配 |
| [[:upper:]]{3}$ |
是 |
結(jié)尾的大寫(xiě) DEF 匹配 |
| ^[[:alpha:]]{3} |
是 |
起始處的 abc 匹配 |
^ 和 $ 當(dāng)然能同時(shí)使用,這種情況將括起來(lái)的正則表達(dá)式匹配整個(gè)字符串 (或行)。有時(shí) ^$ 這樣簡(jiǎn)易的正則很好用,可以用來(lái)匹配空的字符串或行列。例如加上 grep -v 選項(xiàng)用來(lái)顯示所有不匹配模式的行們使用上面的做法,便能過(guò)濾掉文件里的空號(hào)。
^$ 盡在起始與結(jié)尾具有特殊用處。例如 ab^cd 里的 ^ 表示的就是自身 (^)。
- BRE 運(yùn)算符喲普先機(jī),由高到低
- [..] [==] [::] 用于字符拍的方括號(hào)符號(hào)
- \metacharacter 轉(zhuǎn)移的 meta 字符
- [] 方括號(hào)表達(dá)式
- {} 子表達(dá)式
-
- {} 前置單個(gè)字符重現(xiàn)的正則表達(dá)式
- 無(wú)符號(hào) 連續(xù)
- ^$ 錨點(diǎn)