一、正則表達(dá)式
正則表達(dá)式(RE)是一種字符模式,用于再查找過程中匹配指定的字符,在大多數(shù)程序中,正則表達(dá)式都被置于兩個(gè)正斜杠之間:例如//就是由正斜杠界定的正則表達(dá)式,他將匹配被查找的行中任何位置出現(xiàn)的相同模式。在正則表達(dá)式中,元字符時(shí)最重要的概念。
元字符
定義:元字符是這樣的一類字符,他們表達(dá)的是不同于字面本身的含義
分類:基本正則表達(dá)式字符和擴(kuò)展正則表達(dá)式字符
基本正則表達(dá)式字符
^? ? ? ? | 行首定位符 |
$? ? ? ? | 行尾定位符 |
.? ? ? ? ? | 點(diǎn),匹配任意單個(gè)字符 |
*? ? ? ? | 匹配前導(dǎo)符0到多次 |
.* |
任意多個(gè)字符 |
[] | 匹配指定范圍的一個(gè)字符 |
[-] | 匹配指定范圍的一個(gè)字符,連續(xù)的范圍 |
[^] | 匹配不在指定組內(nèi)的字符 |
\ | 用來轉(zhuǎn)義元字符(‘’? “”? \? ),脫義符 |
\< | 詞首定位符 |
\> | 詞尾定位符 |
() | \(\)? ?匹配稍后使用的字符的標(biāo)簽 :3,9 s/\(.*)/#\1/? ?加注釋 :3,9 s/\(#\)\(.*)/\2\1/? ?將#號移到最后 s替換? ?\原來\現(xiàn)在\ |
x\{m\} | 字符x重復(fù)出現(xiàn)m次 |
x\{m,\} | 字符x重復(fù)出現(xiàn)m次以上 |
x\{m,n\} | 字符x重復(fù)出現(xiàn)m次到n次 |
擴(kuò)展正則表達(dá)式字符
+ | 匹配1-n個(gè)前導(dǎo)字符 |
? | 匹配0-1個(gè)前導(dǎo)字符 |
a|b | 匹配a或b |
() | 組字符 |
示例1:
示例2:
二、grep
過濾,查找文件中的內(nèi)容
分類:grep,egrep和fgrep
返回值:
- 0? ?是找到了
- 1? ?是沒有
- 2找的地方不對
示范:
參數(shù):
練習(xí)
三、sed(逐行處理模式)
1.前言
sed,流編輯器,StreamEditor,sed是一種在線的,非交互式的編輯器,他一次處理一行內(nèi)容。處理時(shí),把當(dāng)前處理的行存儲在臨時(shí)緩沖區(qū),成為“模式空間”,接著用sed命令處理緩沖區(qū)的內(nèi)容,處理完成后,把緩沖區(qū)的內(nèi)容送至屏幕。接著處理下一行,這樣不斷重復(fù),指導(dǎo)文件末尾,文件內(nèi)容并沒有改變,除非你使用重定向存儲輸出。sed主要用來自動編輯一個(gè)或多個(gè)文件,簡化對文件的反復(fù)操作。
2.格式
- sed? 選項(xiàng)? ?命令? ?文件
- sed? 選項(xiàng)? -f? ?腳本文件
3.返回值
都是0,對錯(cuò)不管
只有當(dāng)命令存在語法錯(cuò)誤時(shí),sed的退出狀態(tài)才是非0
4.sed和正則表達(dá)式
與grep一樣,sed在文件中查找模式是也可以使用正則表達(dá)式(RE)和各種元字符。正則表達(dá)式是括在斜杠間的模式,用于查找和替換,以下是sed支持的元字符
- 使用基本元字符集? ? ^,$,.,*,[],[^],\<,\>,\(\),
- 使用擴(kuò)展元字符集? ? ?,+,|,()
- 使用擴(kuò)展元字符的方式? ? \+ 轉(zhuǎn)義? ? sed? -r? ?加-r? ? ? ?-i是寫入
5.匯總示例
刪除命令:d | ![]() |
替換命令:s | ![]() |
讀文件命令:r | ![]() |
寫文件命令:w(另存為) | ![]() |
追加命令:a(之后) | |
插入命令:i(之前) | 與a相反,i插入到行前 |
替換整行命令:c | ![]() |
獲取下一行命令:n | ![]() |
反向選擇:! | ![]() |
多重編輯:e | 在一條命令中發(fā)布多條指令 |
一行針對多條命令一定要用括號括起來
sed? -r? ? '/root/{n:d}'??passwd
6.實(shí)戰(zhàn)案例
1.刪除配置文件中的#號注釋行
sed? ?-r? ? '/^#/d'? ?/etc/sanba/smb.conf
2.修改文件
?sed -ri? '$a\chroot_local_user=YES' /etc/vsftpd/vsftpd.conf
?sed -ri? '/^SELINUX=/c? SELINUX=disabled' /etc/selinux/config
3.給文件行添加注釋
sed -r? '2,6s/^/#/' a.txt
sed -r? '2,6s/(.*)/#\1/'? a.txt
sed -r? '2,6s/.*/#&/'?? a.txt
4.sed中使用外部變量
準(zhǔn)備工作? ?var1=11111
追加變量? ?
巧合
四、awk
1.前言
????????awk 是一種編程語言,用于在linux/unix下對文本和數(shù)據(jù)進(jìn)行處理,數(shù)據(jù)可以來自標(biāo)準(zhǔn)輸入、一個(gè)或多個(gè)文件,或其它命令的輸出。它支持用戶自定義函數(shù)和動態(tài)正則表達(dá)式等先進(jìn)功能,
awk的處理文本和數(shù)據(jù)的方式是這樣的,它逐行掃描文件,從第一行到最后一行,尋找匹配的特定模式的行,并在這些行上進(jìn)行你想要的操作。如果沒有指定處理動作,則把匹配的行顯示到標(biāo)準(zhǔn)輸出(屏幕)。
2.工作原理
3.語法
awk? ? [options]? ? 'command'? ? filenames(推薦)
==options 例如:-F 定義輸入字段分隔符,默認(rèn)的分隔符是空格或制表符(tab)
==command(時(shí)空):
- BEGIN{}? ? ? ? ?begin發(fā)生在行處理前(注意大寫)?
- {}? ? ? ? ? ? ? ? ? ? 行處理時(shí),讀一次執(zhí)行一次 (現(xiàn)在)
- END{}? ? ? ? ? ? ?行處理后
示例
awk? 'BSGIN{print 1/2}? {print "OK"}? END{print "-------------"}'? ? /etc/hosts
awk? 'BSGIN{print 1/2}{print "OK";print $0}END{print "hoho"}'? ? /etc/hosts
4.內(nèi)部變量
FS | 輸入字段分隔符 (默認(rèn)空格 |
awk -F:'print $1, $3' /etc/passwd | head -1 awk -F‘[:\t]’ {print $1,$2,$3} /etc/passwd awk ‘BEGIN{FS=":"} {print $1,$3}’? /etc/passwd |
OFS | 輸出字段分隔符 | awk ‘BEGIN{FS=":";OFS="---"} {print $1,$3}’? /etc/passwd |
RS | 輸入記錄(行)分隔符,默認(rèn)換行符 | ![]() |
ORS | 輸出記錄(行)分隔符,默認(rèn)換行符 | ![]() |
FNR | 多文件獨(dú)立編號 | ![]() |
NR | 多文件匯總編號 | ![]() |
NF | 字段總數(shù) | ![]() |
5.模式化輸出
print(函數(shù))
6.模式(正則表達(dá))和動作
1.前言
????????任何awk語句都由模式和動作組成。模式部分決定動作語句何時(shí)觸發(fā)及觸發(fā)事件如果省略模式部分,動作將時(shí)刻保持執(zhí)行狀態(tài)。每一行都會有動作。模式可以是任何條件語句或復(fù)合語句或正則表達(dá)式。有模式的話,就是對模式對應(yīng)的行進(jìn)行動作
2.字符串比較
awk? '/^root/? ?/etc/passwd? ? ? ? ?//是正則匹配
awk? '$0 ~ /^root/? /etc/passwd? ? ~像
awk '$0! ~ /^root/'? /etc/passwd
awk? -F;'$1~ /^root/'? /etc/passwd
3.數(shù)值比較
????????比較表達(dá)式采用對文本進(jìn)行比較,只有當(dāng)條件為真,才執(zhí)行指定的動作。比較表達(dá)式使用關(guān)系運(yùn)算符,用于比較數(shù)字與字符串
關(guān)系運(yùn)算符
算數(shù),運(yùn)算
4.多條件
邏輯操作符和復(fù)合模式
范圍模式
7.awk腳本編程
1.變量
awk調(diào)用變量
>1自定義內(nèi)部變量? -v
awk? -v? user=root? ?-F: '$1==user'? /etc/passwd? ? ? -v定義變量
>2外部變量“ ‘ ”
雙引號
單引號
2.條件&判斷
if語句
????????格式:?{if(表達(dá)式){語句;語句;...} }
? ? ? ? 示例:需求 :如果$3是0,就說他是管理員
? ? ? ? ? ? ? ? ? awk -F: '{if($3==0) {print $1 " is administrator."}}'? /etc/passwd
if..else語句
? ? ? ? 格式:{if(表達(dá)式){語句;語句;...} else {語句;語句;...}}
? ? ? ? 示例:?awk -F: {if($3==0) {print $1"是管理員“} else { print? $1"普通用戶" }}’? passwd
if..else?if..else語句
3.循環(huán)
while
for
4.數(shù)組
定義數(shù)組
索引遍歷? ? for(i? in? username)? username加[]i是值,不加i是索引
5.awk編程案例-統(tǒng)計(jì)/etc/passwd中各種類型shell的數(shù)量
文章來源:http://www.zghlxwxcb.cn/news/detail-833481.html
8.一問一答
文章來源地址http://www.zghlxwxcb.cn/news/detail-833481.html
到了這里,關(guān)于Liunx shell編程及自動化運(yùn)維實(shí)現(xiàn)--第五章三劍客的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!