?目錄
一、常規(guī)匹配
二、常用特殊字符
三、匹配手機號
四、案例之歸檔文件
五、案例之定時歸檔文件
六、Shell文本處理工具
1. cut工具
2. awk工具
一、常規(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ù)來代替重復(fù)的0-9;但是要在正則表達式之前加入-E選項,如下:
grep -E ^1[3,4,5,7,8,9][0-9]{9}$
大于小于11位數(shù)字都是不符合的?
四、案例之歸檔文件
實際生產(chǎn)應(yīng)用中,往往需要對重要的數(shù)據(jù)進行歸檔備份
需求:實現(xiàn)一個目錄歸檔備份的腳本,輸入一個目錄名稱,將目錄下所有文件按天歸檔保存,并將歸檔日期附加在文檔文件名上,放在根目錄下(/archive)
這里用到的歸檔命令: tar
后面可以加上 -c 選項表示歸檔,加上 -z 選項表示同時進行壓縮得到的文件后綴名為 .tar.gz;不過要注意的是可能還是需要加上P選項代表允許我們使用絕對路徑進行歸檔。
#!/bin/bash
# 首先判斷輸入的參數(shù)個數(shù)是否為1
if [ $# -ne 1 ]
then
?? ?echo "參數(shù)個數(shù)錯誤!應(yīng)該輸入一個參數(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
fiexit
五、案例之定時歸檔文件
比如說我們想要1分鐘歸檔文件一次;就可以設(shè)置定時器如下:
*/1 * * * * /archive/archive_test.sh /scripts
可以看得出確實添加了一個歸檔文件?
六、Shell文本處理工具
1. cut工具
cut 的工作就是“剪”,具體的說就是在文件中負責(zé)剪切數(shù)據(jù)用的。
cut 命令從文件的每行剪切字節(jié)、字符和字段并將這些字節(jié)、字符和字段輸出
基本用法
cut [選項參數(shù)] filename
選項參數(shù)
選項參數(shù) | 功能 |
-f | 列號,提取第幾列 |
-d | 分隔符,按照指定分隔符分割列,默認是制表符"\t" |
-c | 按字符進行切割,后加n表示取第幾列 比如-c 1 |
比如一個文本文件有以下詩歌:
比如說我們需要提取第一列,那應(yīng)該這樣寫,按空格指定分割第一列;如下:
cut -d " " -f 1 cut_test.txt
假如我們想要提取第一和第四列,可以這樣寫:?
cut -d " " -f 1,4?cut_test.txt
比如說我們想知道ens33網(wǎng)卡的所有IP,那么首先應(yīng)該是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}'文章來源:http://www.zghlxwxcb.cn/news/detail-795870.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-795870.html
到了這里,關(guān)于Shell 正則表達式及綜合案例及文本處理工具的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!