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