Shell 正則表達(dá)式及綜合案例及文本處理工具詳解
一、常規(guī)匹配
一串不包含特殊字符的正則表達(dá)式匹配它自己
例子,比如說(shuō)想要查看密碼包含root字符串的,可以這樣寫(xiě)
cat /etc/passwd | grep root
二、常用特殊字符
特殊字符 | 作用 |
^ | 匹配一行的開(kāi)頭 |
$ | 匹配一行的結(jié)束 |
. | 匹配任意一個(gè)字符 |
* | *不單獨(dú)使用,他和上一個(gè)字符連用,表示匹配上一個(gè)字符0次或者多次 |
[] | []表示匹配某個(gè)范圍內(nèi)的一個(gè)字符 |
\ | 表示轉(zhuǎn)義字符,一般和特殊字符連用表示特殊字符本身 |
例1:匹配以a字符開(kāi)頭的:
cat /etc/passwd | grep ^a
例子2:匹配以e字符結(jié)尾
cat /etc/passwd | grep e$
例子3:匹配任一個(gè)字符
cat /ect/passwd | grep r.t
cat /ect/passwd | grep r..t
例子4:查詢包含以字符r開(kāi)頭,t結(jié)尾的字符串
cat /etc/passwd | grep r.*t
[6,8] ------匹配6或者8
[0-9] ------匹配一個(gè)0-9 的數(shù)字
[0-9]* ------匹配任意長(zhǎng)度的數(shù)字字符串
[a-z] ------匹配一個(gè) a-z 之間的字符
[a-z]* -----匹配任意長(zhǎng)度的字母字符串
[a-c,e-f] ---匹配 a-c 或者 e-f之間的任意字符
用法例子看下圖吧:
例子6:假如說(shuō)我們想查找n_test.sh文件包含$符的那這就需要用到轉(zhuǎn)義字符
cat /scripts/n_test.sh | grep '\$'
三、匹配手機(jī)號(hào)
我們都知道手機(jī)號(hào)是由第一位數(shù)字是1,第二位是3,4,5,7,8,9;其余數(shù)字隨便。總共十一位數(shù)字,因此我們可以得出
"1569656955" | grep ^1[3,4,5,7,8,9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]$
看上圖可以得知,第一個(gè)數(shù)字符合手機(jī)號(hào)形式,而第二個(gè)明顯不符合。但是這樣【0-9】太多了,比較繁瑣,我們就可以在后面用一個(gè)大括號(hào)表示出現(xiàn)次數(shù)來(lái)代替重復(fù)的0-9;但是要在正則表達(dá)式之前加入-E選項(xiàng),如下:
grep -E ^1[3,4,5,7,8,9][0-9]{9}$
大于小于11位數(shù)字都是不符合的
四、案例之歸檔文件
實(shí)際生產(chǎn)應(yīng)用中,往往需要對(duì)重要的數(shù)據(jù)進(jìn)行歸檔備份
需求:實(shí)現(xiàn)一個(gè)目錄歸檔備份的腳本,輸入一個(gè)目錄名稱,將目錄下所有文件按天歸檔保存,并將歸檔日期附加在文檔文件名上,放在根目錄下(/archive)
這里用到的歸檔命令: tar
后面可以加上 -c 選項(xiàng)表示歸檔,加上 -z 選項(xiàng)表示同時(shí)進(jìn)行壓縮得到的文件后綴名為 .tar.gz;不過(guò)要注意的是可能還是需要加上P選項(xiàng)代表允許我們使用絕對(duì)路徑進(jìn)行歸檔。
#!/bin/bash # 首先判斷輸入的參數(shù)個(gè)數(shù)是否為1 if [ $# -ne 1 ] then echo "參數(shù)個(gè)數(shù)錯(cuò)誤!應(yīng)該輸入一個(gè)參數(shù)作為歸檔目錄名" exit fi # 從參數(shù)中獲取目錄名稱,查看目錄名稱是否存在 if [ -d $1 ] then echo else echo echo "目錄不存在!" echo exit fi # 獲取絕對(duì)路徑 DIR_NAME=$(basename $1) DIR_PATH=$(cd $(dirname $1);pwd) # 獲取當(dāng)前日期,歸檔文件名拼接成日期 DATE=$(date +%y%m%d) # 訂閱生成歸檔文件名稱 FILE=archive_${DIR_NAME}_$DATE.tar.gz # 訂閱生成歸檔文件的路徑 DEST=/archive/$FILE # 開(kāi)始?xì)w檔目錄文件 echo "開(kāi)始?xì)w檔...." echo # -c 歸檔 z 壓縮 f可視化 tar -czPf $DEST $DIR_PATH/$DIR_NAME # 判斷上面文件歸檔文件操作是否成功 if [ $? -eq 0 ] then echo echo "歸檔成功" echo "歸檔的文件為:$DEST" echo else echo "歸檔出現(xiàn)問(wèn)題" echo fi exit
五、案例之定時(shí)歸檔文件
比如說(shuō)我們想要1分鐘歸檔文件一次;就可以設(shè)置定時(shí)器如下:
*/1 * * * * /archive/archive_test.sh /scripts
可以看得出確實(shí)添加了一個(gè)歸檔文件
六、Shell文本處理工具
1. cut工具
cut 的工作就是“剪”,具體的說(shuō)就是在文件中負(fù)責(zé)剪切數(shù)據(jù)用的。
cut 命令從文件的每行剪切字節(jié)、字符和字段并將這些字節(jié)、字符和字段輸出
基本用法
cut [選項(xiàng)參數(shù)] filename
選項(xiàng)參數(shù)
選項(xiàng)參數(shù)功能-f列號(hào),提取第幾列-d分隔符,按照指定分隔符分割列,默認(rèn)是制表符"\t"-c按字符進(jìn)行切割,后加n表示取第幾列 比如-c 1
比如一個(gè)文本文件有以下詩(shī)歌:
比如說(shuō)我們需要提取第一列,那應(yīng)該這樣寫(xiě),按空格指定分割第一列;如下:
cut -d " " -f 1 cut_test.txt
假如我們想要提取第一和第四列,可以這樣寫(xiě):
cut -d " " -f 1,4 cut_test.txt
比如說(shuō)我們想知道ens33網(wǎng)卡的所有IP,那么首先應(yīng)該是ifconfig ens33,然后管道符|,再然后正則表達(dá)式獲取ip 最后利用管道符切割。
因?yàn)閕p在第十列,因此-f后面跟10;整體寫(xiě)法如下:
ifconfig ens33 | grep netmask | cut -d " " -f 10
2. awk工具
一個(gè)強(qiáng)大的文本分析工具,把文件逐行的讀入,以空格為默認(rèn)分隔符將每行切片,切開(kāi)的部分再進(jìn)行分析處理
基本用法
awk [選項(xiàng)參數(shù)] '/pattern1/{action1}/pattern2/{action2}...' filename
pattern:表示awk 在數(shù)據(jù)中查找的內(nèi)容,就是匹配模式
action:在找到匹配內(nèi)容時(shí)所執(zhí)行的一系列命令
選項(xiàng)參數(shù)功能-F指定文件分割符-v分支一個(gè)用戶定義變量
不過(guò)有些版本的系統(tǒng)是不支持awk工具的,那么如何查看自己系統(tǒng)是否支持awk只需要輸入以下句子即可:
which awk
出現(xiàn)上面那段話說(shuō)明你的系統(tǒng)是支持awk工具的
實(shí)例操作
1. 搜索passwd文件以root關(guān)鍵字開(kāi)頭的所有行,并輸出該行的第7列
cat /etc/passwd | awk -F ":" '/^root/ {print $7}'
2. 搜索passwd文件以root關(guān)鍵字開(kāi)頭的所有行,并輸入該行的第1列和第7列,中
間以","分割
cat /etc/passwd | awk -F ":" '/^root/ {print $1 "," $7}'
3. 只顯示/etc/passwd 的第一列和第七列,以逗號(hào)分割,且在所有行前面添加列
名"start"在最后一行添加"over"
cat /etc/passwd | awk -F ":" '/^root/ {print $1"," $7} END{print "over"}'
4. 將passwd文件中的用戶id增加數(shù)值1并輸出
cat /etc/passwd | awk -F ":" '{print $3+1}'
內(nèi)置變量
變量說(shuō)明FILENAME文件名NR已讀記錄數(shù)(行號(hào))NF瀏覽記錄的域的個(gè)數(shù)(切割后,列的個(gè)數(shù))
示例操作
1. 統(tǒng)計(jì)passwd文件名,每行的行號(hào),每列的列數(shù)
cat /etc/passwd | awk -F ":" '{print " 文件名:" FILENAME "\t行號(hào):" NR "\t列數(shù): " NR}' /etc/passwd
2. 查詢ifconfig命令輸出結(jié)果中的空行所在行號(hào)
ifconfig | awk '/^$/ {print"空行: " NR}'
到此這篇關(guān)于Shell 正則表達(dá)式及綜合案例及文本處理工具的文章就介紹到這了,更多相關(guān)Shell 正則表達(dá)式文本處理工具內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
js正則表達(dá)式學(xué)習(xí)和總結(jié)(必看篇)
下面小編就為大家?guī)?lái)一篇js正則表達(dá)式學(xué)習(xí)和總結(jié)(必看篇)。小編覺(jué)得挺不錯(cuò)的,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧,祝大家游戲愉快哦2016-11-11正則表達(dá)式號(hào)碼靚號(hào)類(lèi)型判斷代碼
很多網(wǎng)站需要將好的會(huì)員號(hào)留著,或用于日后的盈利。實(shí)現(xiàn)方法不是本文討論范圍,本文僅列出博主用于檢測(cè)靚號(hào)類(lèi)型的一些正則。2010-05-05在ASP中用“正則表達(dá)式對(duì)象”來(lái)校驗(yàn)數(shù)據(jù)的合法性
在ASP中用“正則表達(dá)式對(duì)象”來(lái)校驗(yàn)數(shù)據(jù)的合法性...2006-06-0613道關(guān)于JavaScript正則表達(dá)式的面試題
本文是小編給大家收藏整理的13道關(guān)于JavaScript正則表達(dá)式的面試題,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2018-10-10正則表達(dá)式,提取網(wǎng)頁(yè)中的鏈接地址
正則表達(dá)式,提取網(wǎng)頁(yè)中的鏈接地址...2006-10-10javascript IP、域名、手機(jī)號(hào)碼正則表達(dá)式驗(yàn)證代碼
一下代碼是腳本之家從多個(gè)網(wǎng)站整理并總結(jié)了下,常用正則表達(dá)式的驗(yàn)證代碼,可以直接使用。2010-04-04