第一部分、正則表達式
1、什么是正則表達式
正則表達式就是處理字符串的方法,它是以行為單位來進行字符串的處理行為,正則表達式通過一些特殊符號的輔助,可以讓用戶輕易的達到查找、刪除、替換某特定字符串的處理程序。
正則表達式基本上是一種“表示法”,只要工具程序支持這種表示法,那么該程序就可以用來作為正則表達式的字符串處理之用。例如vi、grep、awk、sed等工具,因為他們有支持正則表達式,所以這些工具就可以使用正則表達式的特殊字符來進行字符串的處理。但例如cp、ls等命令并未支持正則表達式,所以就只能使用bash自身的通配符。
最后應該注意的是,正則表達式和通配符是完全不一樣的東西,因為通配符是代表的bash接口的一個功能,但是正則表達式是一種字符串處理的表示方式。
2、正則表達式的分類
REGEXP:由一類特殊字符及文本字符所編寫的模式,其中有些字符(元字符)不表示字符字面意義,而表示控制或通配的功能
? 程序支持: grep, vim, less,nginx等
? 分兩類:
基本正則表達式: BRE
擴展正則表達式: EREgrep -E, egrep
? 正則表達式引擎:采用不同算法,檢查處理正則表達式的軟件模塊PCRE( Perl Compatible Regular Expressions)
? 元字符分類:字符匹配、匹配次數、位置錨定、分組
? man 7 regex
3、基本正則表達式的元字符
a、字符匹配:
.:匹配任意單個字符
[]:匹配指定范圍的任意單個字符
[^]:匹配指定范圍外的任意單個字符
b、匹配次數:用在要指定其出現的次數的字符的后面,用于限制其前面字符出現的次數,默認工作于貪婪模式,最大匹配。
c、位置錨定
^:行首錨定,用于模式的最左側
$:行尾錨定,用于模式的最右側
^PATTERN$:用于PATTERN來匹配整行
^$:空白行
^[[:space:]]*$:空白行或包含空白字符的行
單詞位置的錨定,非特殊字符組成的連續字符(字符串)都稱為單詞。
\<或者\b:詞首錨定,用于單詞模式的左側
\>或者\b:詞尾錨定,用于單詞模式的右側
\<PATTERN\>:匹配整個單詞
d、分組及引用:
分組: \(\):將一個或多個字符捆綁在一起,當作一個整體進行處理,如: \(root\)\+
分組括號中的模式匹配到的內容會被正則表達式引擎自動記錄于內部變量中,這些變量為:
\1:模式從左側起,第一個左括號以及與之匹配的右括號之間的模式所匹配的字符
\2:模式從左側起,第二個左括號以及與之匹配的右括號之間的模式所匹配的字符
4、第一大文本處理工具-grep
grep: Global search REgular expression and Print out the line.
作用:文本搜索工具,根據用戶指定的“模式”對目標文
本逐行進行匹配檢查;打印匹配到的行;
模式:由正則表達式字符及文本字符所編寫的過濾條件
grep [OPTIONS] PATTERN [FILE…]
grep root /etc/passwd
grep "$USER" /etc/passwd
grep '$USER' /etc/passwd
grep `whoami` /etc/passwd
–color=auto: 對匹配到的文本著色顯示;
-v: 顯示不能夠被pattern匹配到的行;
-i: 忽略字符大小寫
-n: 顯示匹配的行號
-c: 統計匹配的行數
-o: 僅顯示匹配到的字符串;
-q: 靜默模式,不輸出任何信息
-A #: after, 后#行
-B #: before, 前#行? -C #: context, 前后各#行
-e:實現多個選項間的邏輯or關系
grep –e ‘cat ’ -e ‘dog’ file
-w:整行匹配整個單詞
-E:使用ERE
5、grep練習
例題一、查找特定字符串
a、使用-n選項表示找到包含特定字符串,并顯示其位于第幾行
b、使用-v選項表示找到不包含特定字符串,-n顯示其位于第幾行
c、使用-i選項表示找到包含特定字符串不分大小寫,-n并顯示其位于第幾行
例題二、利用中括號[]來查找集合字符
a、如果我們想查找test或者taste這兩個單詞時,可以發現他們有共同的tst的存在。這個時候我們可以這樣做,其實[]里面不論有幾個字符,他只能代表一個字符。
b、如果我們不想要oo字符前面的g字符的化,我們可以使用集合字符的反向選擇[^]來完成,注意[^]只是代表匹配到的一個字符。
c、查找oo字符前面不是小寫字母
d、查找0-9的任意單個字符(工作貪婪模式,最大匹配,因此有下面的3183字符的匹配)
e、 我們也可以使用[[:lower:]]和[[:digit:]]來替代上面c和d題的表示方法
例題三、行首和行尾的字符錨定^$
a、錨定行首是某個指定的字符,例如以the開頭的行,或者以小寫字母開頭的行
b、錨定行首不是字母開頭的行
c、錨定行尾以點號結尾的行(注意點號在正則表達式代表任意單個字符,所以此處需要轉義)
d、使用行首和行尾可以錨定空白行^$
例題四、任意一個字符.與重復字符*
a、點號代表匹配到任意的一個字符,而*代表前面的字符出現多次或者0次
b、匹配g開頭或者g結尾的,或者同時g開頭g結尾的字符串(開頭的g可有可無,也可以多次)
c、.*兩個匹配g與g之間有多個字符
例題五、限定前面的字符出現的次數范圍{}
a、匹配前面的字符出現兩次(最大匹配)
b、找到goooooogle字符串的行(至少3個o濾除兩個o的)
例題六、使用分組\(\),和\1兩個結合取出兩個oo之間有其他字符的行
\1:此變量表示從第一個左括號匹配到的模式
以上為grep的基本練習,具體詳細的練習見本期博客的作業部分。
第二部分、文本處理工具
一、文件內容查閱工具
cat:由第一行開始顯示文件內容
tac:由最后一行開始顯示,可以看出tac是cat的倒寫形式
rev:與cat類似,是cat的水平倒寫的形式
more:一頁一頁的顯示文件的內容
less:與more類似,但是比more好的是,它可以往前翻頁
head:只看頭幾行
tail:只看結尾的幾行
1、文件查看命令:cat,tac,rev
cat [OPTION]… [FILE]…
-E: 顯示行結束符$
-n: 對顯示出的每一行進行編號
-A:顯示所有控制符
-b: 非空行編號
-s:壓縮連續的空行成一行
tac命令為cat命令相反的方向顯示,而rev為cat顯示內容每一行的相反顯示,換句話說tac是cat垂直取反,而rev是cat水平取反。
2、分頁查看文件內容命令:more,less
more: 分頁查看文件
more [OPTIONS…] FILE…
-d: 顯示翻頁及退出提示
v less:一頁一頁地查看文件或STDIN輸出
查看時有用的命令包括:
/文本 搜索 文本
n/N 跳到下一個 或 上一個匹配
less 命令是man命令使用的分頁器
3、顯示文本前后幾行的內容:head、tail
head [OPTION]… [FILE]…
-c #: 指定獲取前#字節
-n #: 指定獲取前#行
– #: 指定行數
tail [OPTION]… [FILE]…
c #: 指定獲取后#字節
-n #: 指定獲取后#行
-f: 跟蹤顯示文件新追加的內容,常用日志監控
二、抽取文本的工具cut和合并文件工具paste
cut [OPTION]… [FILE]…
-d DELIMITER: 指明分隔符,默認tab
-f FILEDS:
#: 第#個字段
#,#[,#]:離散的多個字段,例如1,3,6
#-#:連續的多個字段, 例如1-6
混合使用: 1-3,7
-c 按字符切割
–output-delimiter=STRING指定輸出分隔符
顯示文件或STDIN數據的指定列
cut -d: -f1 /etc/passwd
cat /etc/passwd | cut -d: -f7
cut -c2-5 /usr/share/dict/words
paste 合并兩個文件同行號的列到一行
paste [OPTION]… [FILE]…
-d 分隔符:指定分隔符,默認用TAB
-s : 所有行合成一行顯示
paste f1 f2
paste -s f1 f2
三、分析文本的工具
文本數據統計: wc
整理文本: sort和uniq
比較文件: diff和patch
計數單詞總數、行總數、字節總數和字符總數,可以對文件或STDIN中的數據運行
$ wc story.txt
39 237 1901 story.txt
行數 字數 字符數
使用 -l 來只計數行數
使用 -w 來只計數單詞總數
使用 -c 來只計數字節總數
使用 -m 來只計數字符總數
把整理過的文本顯示在STDOUT,不改變原始文件
$ sort [options] file(s)
常用選項
-r 執行反方向(由上至下)整理
-n 執行按數字大小整理
-f 選項忽略( fold)字符串中的字符大小寫
-u 選項(獨特, unique)刪除輸出中的重復行
-t c 選項使用c做為字段界定符
-k X 選項按照使用c字符分隔的X列來整理能夠使用多次
uniq命令:從輸入中刪除重復的前后相接的行
uniq [OPTION]… [FILE]…
-c: 顯示每行重復出現的次數
-d: 僅顯示重復過的行
-u: 僅顯示不曾重復的行
連續且完全相同方為重復
常和sort 命令一起配合使用:先排序后計數sort userlist.txt | uniq -c
比較兩個文件之間的區別
$ diff foo.conf-broken foo.conf-works
< use_widgets = no
—
> use_widgets = yes
注明第5行有區別(改變)
diff 命令的輸出被保存在一種叫做“補丁”的文件中使用 -u 選項來輸出“統一的( unified)” diff格式文
件,最適用于補丁文件。
patch 命令復制在其它文件中進行的改變(要謹慎使用?。?/span>
適用 -b 選項來自動備份改變了的文件
diff -u foo.conf-broken foo.conf-works > foo.patch
patch -b foo.conf-broken foo.patch
以上部分文本處理工具相關命令的練習,見本期博客的練習題部分
原創文章,作者:AndyIvanXue,如若轉載,請注明出處:http://www.www58058.com/30956