正則表達(dá)式:
不是一個(gè)工具程序,而是一個(gè)字符串處理的標(biāo)準(zhǔn)依據(jù),是使單個(gè)字符串搜索、匹配一系列符號(hào)某個(gè)語(yǔ)法規(guī)則的字符串。
正則表達(dá)式的作用:
1、測(cè)試字符串的模式,數(shù)據(jù)驗(yàn)證
2、替換文本
3、基于匹配模式去文本文件中提取出符合條件的內(nèi)容
正則表達(dá)式:用來(lái)查找文件內(nèi)容、文本、字符串,一般只支持四劍客grep、egrep、sed、awk
通配符:用來(lái)查找文件或者目錄的,普通命令都支持。find
正則表達(dá)式分類(lèi):
基礎(chǔ)正則表達(dá)式:BRE,常用的正則表達(dá)式
擴(kuò)展正則表達(dá)式:ERE,對(duì)于基礎(chǔ)正則表達(dá)式的擴(kuò)充和深化
linux文本處理工具:
vi/vim編輯器
grep(只支持基礎(chǔ)正則表達(dá))
egrep(支持?jǐn)U展正則表達(dá))
sed(支持?jǐn)U展正則表達(dá))
awk(支持基礎(chǔ)正在表達(dá)支持?jǐn)U展正則表達(dá)式)
字符串匹配的模式:
作用:用來(lái)檢查一個(gè)串是否包含某種子串,將匹配的子串替換或者從某個(gè)串中取出符合某個(gè)條件的子串等。
通配符:
?:匹配文件名中含有0個(gè)或者1個(gè)字符
*:匹配0個(gè)或多個(gè)字符,一般以......開(kāi)頭
find / -name “a?”
find / -name “a*”
^[0-9]+abc$
注:
^:以什么開(kāi)頭
[0-9]:代表數(shù)字,匹配單個(gè)數(shù)字
+:配置多個(gè),匹配多個(gè)數(shù)字
abc$:以abc結(jié)尾
^[a-z0-9_-]{3,15}$
注:
^[a-z0-9_-]:^代表以什么開(kāi)頭;a-z代表字母a-z;0-9代表數(shù)字0-9;下劃線;連字符
{3,15}:3~15字符的長(zhǎng)度
$:代表結(jié)束標(biāo)記
基礎(chǔ)正則表達(dá)式的元字符:
元字符 |
作用 |
\ | 轉(zhuǎn)義字符,用于取消特殊符號(hào)的含義,如:!、\n等 |
^ | 匹配字符串的開(kāi)始位置,如:^world匹配以world開(kāi)頭的行 |
$ | 匹配字符串的結(jié)束位置,如:world$匹配以world開(kāi)頭的行 |
. | 匹配除\n(換行)之外的任意一個(gè)字符 |
* | 匹配前面的子表達(dá)式0次或者多次 |
[list] | 匹配list列表中的一個(gè)字符,如:[0-9]匹配任一位數(shù)字 |
[^list] | 匹配不在list列表中的一個(gè)字符,如:[^0-9]匹配任意一位非數(shù)字字符 |
{n} | 匹配前面的子表達(dá)式n次,如:[0-9]{2}匹配兩位數(shù)字 |
{n,} | 匹配前面的子表達(dá)式不少于n次,如:[0-9]{2,}表示兩位及兩位以上數(shù)字 |
{n,m} | 匹配前面的子表達(dá)式n到m此,如:{a-z}{2,3}匹配兩到三位的小寫(xiě)字母 |
擴(kuò)展正則表達(dá)式的元字符:
元字符 |
作用 |
+ | 匹配前面表達(dá)式1次以上,如:go+d,將匹配至少一個(gè)o |
? | 匹配前面的子表達(dá)式0次或者1次,如go?d,將匹配gd或god |
() | 將()號(hào)中的字符串作為一個(gè)整數(shù),如:(xzy)+,將匹配xyz整體1次以上 |
管道符號(hào) | 以或的方式匹配字符串,如:good管道符號(hào)great,將匹配good或者great |
四劍客:grep、egrep、sed、awk
grep工具
-i:忽略大小寫(xiě)
-v:取反
過(guò)濾出
過(guò)濾掉
grep ‘root’ /etc/passwd //篩選文件中包含root的行
grep -v ‘root’ /etc/passwd //篩選文件中不包含root的行
注:-v 表示過(guò)濾掉,不顯示出來(lái)
grep ‘r..d’ /etc/passwd //篩選r和d之間有兩個(gè)字符的行
grep ‘[^s]bin’ /etc/passwd //篩選bin前面不是s的行
grep ‘^$’ /etc/passwd //篩選出空白行
grep ‘t[es]’ /etc/passwd //篩選包含字符串te或ts的行
grep ‘0\{1,\}’ /etc/passwd //查找數(shù)字0出現(xiàn)1次及以上的行
grep -e "root;sshd" 文件名
grep -e ‘root’ -e ‘sshd’ /etc/passwd //查找root和sshd的行,-e參數(shù)查找多個(gè)模式
grep ’[^a-z]ae’ /etc/passwd //篩選ae前面不是小寫(xiě)字母的行
grep ’^[a-z]ae’ /etc/passwd //篩選ae前面是小寫(xiě)字母的行
注:當(dāng)使用連續(xù)的字符時(shí),小寫(xiě)字母[a-z],大寫(xiě)字母[A-Z],數(shù)字[0-9]
grep ’o*’ /etc/passwd //匹配所有內(nèi)容(若有空白行的文件,甚至包括空白行)
注:oo*匹配至少包含一個(gè)o的行(第一個(gè)o必須出現(xiàn),第二個(gè)o可出現(xiàn)0次或多次)
egrep工具
egrep '0+' /etc/passwd //匹配至少包含一個(gè)0的行
egrep ‘(root|ntp)’ /etc/passwd //匹配包含root或者nto的行
egrep ‘ro?t’ /etc/passwd //匹配rt或者rot的行
egrep -v ‘^$|^#’ /etc/passwd //過(guò)濾文件中空白行與#開(kāi)頭的行,沒(méi)有空白行與#號(hào)開(kāi)頭的行,所以沒(méi)有任何輸出
sed工具概述
sed是文本處理工具,讀取文本內(nèi)容,根據(jù)指定的條件進(jìn)行處理,如刪除,替換,添加等
可在無(wú)交互的情況下實(shí)現(xiàn)相當(dāng)復(fù)雜的文本處理操作
被廣泛應(yīng)用于shell腳本,已完成自動(dòng)化處理任務(wù)
sed依賴于正則表達(dá)式
sed命令語(yǔ)法:
sed -e ‘編輯指令’ 文件1 文件2... 注:-e,在’編輯命令’中有”;”來(lái)分隔執(zhí)行命令
sed -n -e ‘編輯指令’文件1 文件2... -n只顯示過(guò)濾出內(nèi)容
sed -i -e ‘編輯指令’ 文件1 文件2... -i:流編輯器,讀一行處理一行
sed命令格式:
編輯命令格式:[地址1,[地址2]]操作[參數(shù)]
“地址”,可數(shù)字、正則表達(dá)式、$,如果沒(méi)有地址代表是所有行
“操作”,可以是p、d、s、r、w、i等
“參數(shù)”,一般有g(shù),代表只要符合條件的全部進(jìn)行處理(g全部)
常用操作:
p:輸出指定的行
d:刪除指定的行
s:子串替換,格式:”行范圍s/舊字符串/新字符串/g”
r:讀取指定條件
w:保存為文件
i:插入,在當(dāng)前行前面插入一行或多行
輸出指定的行:
sed -n ‘p’ /etc/passwd //將所有內(nèi)容輸出 cat
sed -n ‘-7p’ /etc/passwd //將第7行內(nèi)容輸出
sed -n ‘$p’ /etc/passwd //將最后一行輸出
sed -n ‘1,7{p;n}’ /etc/passwd //將1~7行中的奇數(shù)行輸出
sed -n ‘1,7{n;p}’ /etc/passwd //將1~7行中的偶數(shù)行輸出
sed -n ‘1,+4p’ /etc/passwd //從第1行,連續(xù)4行進(jìn)行輸出
sed -n ‘/root/p’ /etc/passwd //將匹配包含root的行進(jìn)行輸出
sed -n ‘10,/nom/p’ /etc/passwd //將從第10行至第一個(gè)包含nom的進(jìn)行輸出
sed -nr ‘/ro{1,}t/p’ /etc/passwd //匹配不少于1次前導(dǎo)字符0,加-r參數(shù)支持?jǐn)U產(chǎn)展正則表達(dá)式 rot root
sed -n’/root\|ntp/p’ /etc/passwd //輸出包含root或者ntp的行 注:如果遇到特殊符號(hào),擴(kuò)展正則需要轉(zhuǎn)義符”\”
sed -n ‘/root/=’ /etc/passwd //將包含root所在的行行號(hào)輸出,“=”用來(lái)輸出行號(hào)
sed -e ‘5q’ /etc/passwd //輸出前五行信息后退出,q退出
sed -e ‘5p ; 7p;9p’ /etc/passwd //輸出5行、7行、9行信息插入符合條件的行:
插入符合條件的行:
sed ‘root/i admin:x:490:490::/:/sbin/nologin’ /etc/passwd //在包含root行的前面一行插入admin:x:490:490::/:/sbin/nologin
sed ‘/root/a admin:x:490:490::/:/sbin/nologin’ /etc/passwd //在包含root行的下一行插入admin:x:490:490::/:/sbin/nologin
sed ‘3aADMIN’ /etc/passwd //在第3行之后插入ADMIN
刪除符合要求的行:
sed ‘1d’ /etc/passwd //刪除第一行
sed ‘$d’ /etc/passwd //刪除最后一行
sed ‘/^$/d’ /etc/passwd //刪除所有空行
sed ‘2,4d’ /etc/passwd //刪除第2到4行
sed ‘/root/d’ /etc/passwd //刪除包含root的行,這里的”i”表示取反操作
sed ‘/^root/d’ /etc/passwd //刪除以root開(kāi)頭的行
sed ‘/nologin$/d’ /etc/passwd //刪除以nologin結(jié)尾的行替換成符合條件的文本:
sed ‘s/root//g’ /etc/passwd //將文件中所有的root都替換成空 加g替換所有 s:全部?jī)?nèi)容
sed ’/root/c admin:x:490:490::/:/sbin/nologin’ /etc/passwd //將含有root的行為替換為admin:x:490....
sed -n ‘s/root/admin/2p’ /etc/passwd //把每行的第2個(gè)root替換成admin
sed ’/root/s/root/ROOT/g’ /etc/passwd //將第1~3行中的所有bin都替換成BIN
sed ‘s/$/ABC/’ /etc/passwd //在每行行尾插入字符串ABC
sed ‘s/^/#/’ /etc/passwd //在每行行首插入#號(hào)
sed ‘/root/s /^/#/’ /etc/passwd //將包含root的行的行首插入#號(hào)
sed ‘1c ABC’ /etc/passwd //將第一行替換成ABC
sed ‘y/root/ROOT/’ /etc/passwd //將root對(duì)應(yīng)替換為ROOT y:對(duì)應(yīng)替換
sed ‘/1,10y/root/ROOT/’ /etc/passwd //將第1~10行中的root對(duì)應(yīng)替換為ROOT
遷移符合條件的文本:
sed ‘15,16 w out.txt’ test.txt //另存為
sed ‘5r /etc/reslov.conf’ test.txt //將/etc/reslov.conf內(nèi)容讀取的當(dāng)前文件第五行后面
sed ‘1,5{H;d};$G’ test.txt //將第1~5行內(nèi)容遷移至末尾 注:H,復(fù)制到緩沖區(qū)。G,追加到指定行后
sed ‘/^ip/s/^/#/’ test.txt //在以ip開(kāi)頭的行的行首插入#
sed ‘1,5H;15,16G’ test.txt
執(zhí)行多次命令:
sed -ne ‘s/root/admin/’ -ne ‘s/bash/sh/p’ /etc/passwd //將root和bash動(dòng)作替換
sed -ne ‘s/root/admin/;s/bash/sh/p’ /etc/passwd //將root和bash動(dòng)作替換
直接修改文件內(nèi)容: 有-i直接修改原文件,保存修改后的文件
sed -i ‘s/^/#/’ /etc/passwd //在每行開(kāi)頭插入#號(hào),直接修改原文件
awk工具介紹
awk也是一個(gè)功能強(qiáng)大的編輯工具,與sed一樣,可在無(wú)交互的情況下實(shí)現(xiàn)相當(dāng)復(fù)雜的文本操作
命令格式:
awk 選項(xiàng) '模式或條件 {編輯指令}’ 文件1 文件2
awk -f 腳本文件 文件1 文件2
工作原理:
逐行讀取文本,默認(rèn)以空格為分隔符進(jìn)行分隔,將分隔所得的各個(gè)字段保存到內(nèi)建變量中,并按模式或者條件執(zhí)行編輯命令
awk內(nèi)置變量
FS:指定每行文本的字段分隔符,缺省為空格或制表位。 注:默認(rèn)分隔符為空格 等同于-F
NF:當(dāng)前處理的行的字段個(gè)數(shù)
NR:當(dāng)前處理的行的行號(hào)(序數(shù))
$0:當(dāng)前處理的行的整行內(nèi)容
$n:當(dāng)前處理行的第n個(gè)字段(第n列)
案例:
awk -F: '{print $0,NF}' /etc/passwd //輸出以冒號(hào)為分隔的/etc/passwd文件中記錄的字段段數(shù)
df -hT |awk '{print $1,$6}' //用awk截取命令df -hT輸出的結(jié)果,不帶任何條件,進(jìn)行格式化,打印第1列和第6列數(shù)據(jù)
awk '{print $0}' /etc/passwd //輸出所有內(nèi)容
cat /etc/passwd
grep "" /etc/passwd
sed -n 'p' /etc/passwd //輸出所有內(nèi)容
打印文本內(nèi)容:
awk 'NR==1,NR==3{print}' bfile //輸出第1至第3行內(nèi)容
awk 'NR==1||NR==3{print}' bfile //輸出第1行、第3行內(nèi)容
awk '/^root/{print}' /etc/passwd //輸出以root開(kāi)頭的行
awk '/nologin$/{print}' /etc/passwd //輸出以nologin結(jié)尾的行
awk '(NR>=1)&&(NR<=3){print}' /etc/passwd //輸出第1行到第3行內(nèi)容
awk "(NR%2)==1{print}' /etc/passwd //輸出所有奇數(shù)行的內(nèi)容
awk '(NR%2)==0{print}' /etc/passwd //輸出所有偶數(shù)行的內(nèi)容
awk -F: '!($3<900)' /etc/passwd //輸出第3個(gè)字段不小于900的行,“!”號(hào)表示取反
在使用awk的過(guò)程中,可以使用關(guān)系運(yùn)算符作為“條件”,用于比較數(shù)字與字符串,運(yùn)算符大于(>)、小于(<)、小于等于(<=)、等于(==)、不等于(!=)
也可使用邏輯操作符&&,表示“與”,||表示“或”,!表示“非”
還可以進(jìn)行簡(jiǎn)單的數(shù)學(xué)運(yùn)算加(+)、減(—)、乘(*)、除(/)、取余(%)、乘方(^)。
只有當(dāng)條件為真,才執(zhí)行指定的動(dòng)作。
awk -F: '{if($3>200)print $0}' /etc/passwd //輸出第3個(gè)字段大于200的行
awk -F: '{max=($3>$4)?$3:$4;print max}' /etc/passwd
//如果第3個(gè)字段的值大于第4個(gè)字段的值,則把問(wèn)號(hào)前表達(dá)式的值賦給max,否則就將冒號(hào)后那個(gè)表達(dá)式的值賦給max
awk -F: '{max=($3>200)?$3:$1;print max}' /etc/passwd //如果第3個(gè)字段的值大于200,則把第3個(gè)字段的值賦給max,否則就將第1個(gè)字段的值賦給max
在使用awk過(guò)程中還可以使用條件表達(dá)式,條件表達(dá)式的運(yùn)算涉及兩個(gè)符號(hào),冒號(hào)和問(wèn)號(hào),其實(shí)質(zhì)就是if...else語(yǔ)句的捷徑,有著if...else相同的結(jié)果
接字段輸出文本
awk -F: '{print NR,$0}' /etc/passwd //輸出處理數(shù)據(jù)的行號(hào),每處理完一條記錄,NR值加1
awk -F":" '$3<5{print $1 $3}'/etc/passwd //輸出第3列小于5的第1列與第3列數(shù)據(jù)
awk -F ":" '($1~"root")&&(NF==7){print $1,$3}'/etc/passwd //輸出包含7個(gè)字段,并且第1個(gè)字段中包含root的行第1與第2字段內(nèi)容
awk -F":" 'NR==3,NR==7{print $1,$7}' /etc/passwd //輸出第3行到第7行中以冒號(hào)為分隔符的第1列與第7列的數(shù)據(jù)
輸出數(shù)據(jù)時(shí)插入文本標(biāo)簽:
awk -F: '/^root/{print "Hi," $1}' /etc/passwd //輸出以冒號(hào)為分隔符,以root開(kāi)頭的行第一列,且在前面插入“Hi,”
awk '{print $1"--"$3}' 6.txt //輸出第一列和第二列并加入普通字符 引號(hào)引用普通字符
awk -F":" '$7~"/bash"{print $1}' /etc/passwd //輸出冒號(hào)分隔且第7個(gè)字段中包含/bash的行的第1個(gè)字段
awk -F':''{print $1":"$2":"$3":"$4}' /etc/passwd //保留原來(lái)的格式,輸出以冒號(hào)為分隔,/etc/passwd文件的前4個(gè)字段
awk -F":" '{print $1,$3}' /etc/passwd //輸出以冒號(hào)為分隔符的第1列和第3列
awk 'BEGIN{FS=":"} {print $1,$3}' /etc/passwd //輸出以冒號(hào)為分隔符的第1列和第3列
awk 'BEGIN{X=0};/\/bin\/bash$/{x++};END{printx}' /etc/passwd //統(tǒng)計(jì)以/bin/bash為結(jié)尾的行數(shù)
awk執(zhí)行順序:首先執(zhí)行BEGIN{}中的操作,然后從指定的文件中逐行讀取數(shù)據(jù),自動(dòng)更新NF、NR、$0、$1等內(nèi)建變量的值,去s執(zhí)行'模式或條件{編輯指令}’;最后執(zhí)行END{}操作
處理命令輸出的結(jié)果:
date |awk '{print "Month:"$2"\nYear:"$6}' //輸出日期的第2列且在前面插入Month:,換行輸出第6列并在前面插入Year
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專(zhuān)為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
創(chuàng)新互聯(lián)-專(zhuān)業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比遷西網(wǎng)站開(kāi)發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式遷西網(wǎng)站制作公司更省心,省錢(qián),快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋遷西地區(qū)。費(fèi)用合理售后完善,十余年實(shí)體公司更值得信賴。
文章題目:正則表達(dá)式和四劍客-創(chuàng)新互聯(lián)
文章鏈接:
http://weahome.cn/article/pehse.html