正則表達式對於系統管理員來講是很是重要的,熟練運用正則表達式可以使工做變得更加簡單、方便。正則表達式
正則表達式,又稱正規表達式、常規表達式bash
使用字符串來描述、匹配一系列符合某個規則的字符串運維
簡單來講,是一種匹配字符串的方法,經過一些特殊符號,實現快速查找、刪除、替換某個特定字符串。ide
普通字符:大小寫字母、數字、標點符號及一些其餘符號工具
元字符:在正則表達式中具備特殊意義的專用字符ui
正則表達式對於系統管理員來講是很是重要的,系統運行過程當中會產生大量的信息,這些信息有些是很是重要的,有些則僅是告知的信息。身爲系統管理員若是直接看這麼多的信息數據,沒法快速定位到重要的信息,如「用戶帳號登陸失敗」「服務啓動失敗」等信息。這時能夠經過正則表達式快速提取「有問題」的信息。如此一來,能夠將運維工做變得更加簡單、方便。spa
基礎正則表達式3d
擴展正則表達式code
支持基礎正則表達式:grep;sedserver
支持擴展正則表達式:egrep;awk
基礎正則表達式是經常使用的正則表達式部分
除了普通字符外,常見到如下元字符
■ \ :轉義字符,\!、 \n等 #讓特殊意義的元字符做普通字符使用 ■ ^ :匹配字符串開始的位置 例: ^a、 ^the、 ^# ■ $ :匹配字符串結束的位置 例: word$ ■ . :匹配除\n以外的任意的一個字符 例: go.d、 g..d ■ * :匹配前面子表達式0次或者屢次 例: goo*d、 go.*d ■ [list] :匹配list列表中的一個字符 例: go[ola]d 、[abc]、 [a-z]、 [a-z0-9] ■ [^list] :匹配任意不在list列表中的一個字符 例: [^a-z]、 [^0-9]、 [^A-Z0-9] ■ \{n,m\} :匹配前面的子表達式n到m次,有\{n\}、 \{n,\}、\{n,m\}三種格式 例: go\{2\}d、 go\{2,3\}d、 go\{2,\}d 注意:「o{1,}」 等價於 「o+」 ;「o{0,}」 則等價於 「o*」
2.2 用法示例
grep -n 'the' test.txt #文件檢索出帶‘the’的行並顯示行號 grep -vn 'the' test.txt #文件反向檢索出不帶‘the’的行並顯示行號 grep -n 'sh[oi]rt' test.txt #文件檢索出帶‘short’或‘shirt‘的行並顯示行號 grep -n 'oo' test.txt #文件檢索出至少帶連續oo的行並顯示行號 grep -n 'o\{2\}' test.txt #文件檢索出至少帶連續oo的行並顯示行號 grep -n 'o\{2,\}' test.txt #文件檢索出至少帶連續oo的行並顯示行號 grep -n '[^w]oo' test.txt #文件檢索出連續oo前面不帶w的行並顯示行號 grep -n '^[^w]oo' test.txt #文件檢索出除w外,任意*oo開頭的行並顯示行號 grep -n ' [^a-z]oo ' test.txt #文件檢索出連續oo前面不是小寫字母的行並顯示行號 grep -n '[0-9]' test.txt #文件檢索出包含數字的行並顯示行號 grep -n '[^0-9]' test.txt #文件檢索出不包含純數字的行並顯示行號,非純數字也會匹配 grep -n '[^#]' test.txt #文件檢索出不包含#的行並顯示行號 grep -n '^the' test.txt #文件檢索出以‘the’開頭的行並顯示行號 grep -n ‘^[a-z] ' test.txt #文件檢索出以小寫字母開頭的行並顯示行號 grep -n ‘^[A-Z] ' test.txt #文件檢索出以大寫字母開頭的行並顯示行號 grep -n '^[^a-zA-Z]' test.txt #文件檢索出不以字母開頭的行並顯示行號 grep -n '\.$' test.txt #文件檢索出以 . 號結尾的行並顯示行號 grep -n '^$' test.txt #文件檢索出空行並顯示行號 grep -n 'w..d' test.txt #文件檢索出帶有w開頭,d結尾,中間兩個任意字符的行並顯示行號 grep -n 'ooo*' test.txt #文件檢索出帶有連續oo或兩個0以上的行並顯示行號 grep -n 'oo*' test.txt #文件檢索出帶有o或一個0以上的行並顯示行號 grep -n 'w.*d' test.txt #文件檢索出帶有w開頭,d結尾,中間任意字符也可中間什麼也沒有的行並顯示行號 grep -n '[0-9][0-9]*' test .txt #文件檢索出帶有數字的行並顯示行號
一個強大而簡單的文本解析轉換工具,能夠讀取文本,並根據指定的條件對文本內容進行編輯(刪除、替換、添加、移動等),最後輸出全部行或者僅輸出處理的某些行。
主要包括讀取、執行和顯示三個過程
讀取: sed從輸入流(文件、管道、標準輸入)中讀取一-行內容並存儲到臨時的緩衝區中(又稱模式空間,pattern space)
執行: 默認狀況下,全部的sed命令都在模式空間中順序地執行,除非指定了行的地址,不然sed命令將會在全部的行上依次執行。
顯示: 發送修改後的內容到輸出流。在發送數據後,模式空間將會被清空。在全部的文件內容都被處理完成以前,上述過程將重複執行,直至全部內容被處理完。
注意:默認狀況下全部的sed命令都是在模式空間內執行的,所以輸入的文件並不會發生任何變化,除非是用重定向存儲輸出。
sed [選項] ‘操做’ 參數 sed [選項] -f scriptfile 參數
一、輸出符合條件的文本(p表示正常輸出)
nl test.txt | sed -n ‘p’ #輸出test.txt內容,nl是顯示行號和內容,爲的是輸出結果帶上行號
nl test.txt | sed -n '3p' #輸出test.txt內容第三行帶行號 nl test.txt | sed -n '2,5p' #輸出test.txt內容二到五行帶行號 nl test.txt | sed -n 'p:n' #輸出test.txt內容奇數行帶行號,要先刪除空格 nl test.txt | sed -n 'n:p' #輸出test.txt內容偶數行帶行號,要先刪除空格 nl test.txt | sed -n '1,5{p;n}' #輸出test.txt內容奇數行1~5行帶行號 nl test.txt | sed -n '1,10{n;p}' #輸出test.txt內容偶數行1~10行帶行號 nl test.txt l sed -n '10,${n; p}' #輸出test.txt內容10行到最後一行的偶數行帶行號 sed -n '/the/p' test.txt #輸出test.txt帶the的內容 grep -n 'the' test.txt #文件檢索出帶‘the’的行並顯示行號 nl test.txt | sed -n '4,/the/p' #輸出test.txt內容4行之後帶‘the’的行帶行號 sed -n '/the/=' test.txt #輸出帶‘the’的行的行號 sed -n '/^PI/p' test.txt #查找以‘PI’開頭的行輸出 sed -n '/[0-9]$/p' test.txt #查找以數字結尾的行輸出 grep 'wood' test.txt #查找帶‘wood’的行輸出 sed -n '/\<wood\>/p' test.txt #輸出包含‘wood’的行,\< \>表明單詞邊界
二、刪除符合條件的文本 (d) #只刪除輸出流,不刪除源文件
nl 命令用於計算文件的行數和顯示內容
nl test.txt | sed '3d' #刪除文本第三行 nl test.txt | sed '3,5d' #刪除文本第三到第五行 nl test.txt l sed -n '/cross/p' #查找帶‘cross’的行輸出帶行號 nl test.txt l sed '/cross/d' #刪除帶‘cross’的行 nl test.txt l sed '/cross/!d' #!取反,保留帶‘cross’的行 sed '/^[a-z]/d' test.txt | nl #刪除以小寫字母開頭的行,結果顯示行號 sed '/^[a-z]/d' test.txt #刪除以小寫字母開頭的行 sed -n '/\.$/d' test.txt #刪除以 . 號結尾的行 sed 'p' test.txt #全部內容輸出 sed '/^$/d' test. txt #刪除空行 sed '/.$/d' test.txt #刪除任意字符結尾的行,等於全刪
三、替換符合條件的文本
使用 sed 命令進行替換操做時須要用到 s (字符串替換);c (整行/整塊替換);y (字符轉換) 命令選項
sed 's/the/THE/' test.txt #將每行中的第一個the替換爲THE sed 's/1/L/2' test.txt #將每行中的第2個1替換爲L sed 's/the/THE/g' test.txt #將文件中的全部the替換爲THE sed 's/o//g' test.txt #將文件中的全部o刪除(替換爲空串) sed 's/^/#' test.txt #在每行行首插入#號 sed '/the/s/^/#/' test.txt #在包含the 的每行行首插入#號 sed 's/$/EOF/' test.txt #在每行行尾插入字符串 EOF sed '3,5s/the/THE/g' test.txt #將第3~5 行中的全部the替換爲 THE sed '/the/s/o/0/g'test.txt #將包含the的全部行中的o都替換爲O
四、遷移符合條件的文本
在使用sed 命令遷移符合條件的文本時,經常使用到如下參數:
sed '/the/{H; d};$G' test.txt #將包含the 的行遷移至文件末尾,{;}用於多個操做 sed '1,5 {H; d};17G' test.txt #將第1~5 行內容轉移至第17行後 sed '/the/w out.file' test.txt #將包含the 的行另存爲文件 out.file sed '/the/r /etc/hostname' test.txt #將文件/etc/hostname 的內容添加到包含 the 的每行之後 sed '3aNew' test.txt #在第3行後插入一個新行,內容爲New sed '/the/aNew' test.txt #在包含the的每行後插入一個新行,內容爲New sed '3aNew1\nNew2' test.txt #在第3行後插入多行內容,中間的\n表示換行 注:\n和\r的區別: \n:換行符 是另起一新行 \r :回車符 光標回到一舊行的開頭;
五、使用腳本編輯文件
使用sed腳本將多個編輯指令存放到文件中(每行一條編輯指令),經過「-f」選項來調用。
[root@client2 ~]# vi opt.list #創建一個文件 5H #文件內是sed的操做 5d 16G [root@client2 ~]# sed -f opt.list test.txt #對test.txt進行操做
六、sed直接操做文件示例
編寫一個腳本,用來調整vsftpd 服務配置,要求禁止匿名用戶,但容許本地用戶
[root@server2 ~]# useradd dada [root@server2 ~]# passwd dada [root@server2 ~]# useradd xiaoxiao [root@server2 ~]# passwd xiaoxiao [root@server2 ~]# vi ftp.sh #!/bin/bash A=vsftpd FTP=/etc/vsftpd/vsftpd.conf yum -y install $A sed -i -e '/local_enable/s/NO/YES/g' $FTP sed -i -e '/write_enable/s/NO/YES/g' $FTP sed -i -e 's/^#chroot_local_user=YES/chroot_local_user=YES/g' $FTP sed -i '$aallow_writeable_chroot=YES' $FTP sed -i -e '/listen/s/NO/YES/g' $FTP sed -i -e '/listen_ipv6/s/YES/NO/g' $FTP systemctl start $A netstat -anpt | grep $A [root@server2 ~]# chmod +x ftp.sh [root@server2 ~]# ./ftp.sh
客戶機上安裝ftp進行訪問
[root@server1 ~]# yum -y install ftp [root@server1 ~]# ftp 20.0.0.11 Name (20.0.0.11:root): dada ftp> exit [root@server1 ~]# ftp 20.0.0.11 Name (20.0.0.11:root): xiaoxiao ftp> exit
驗證成功