Shell階段09 shell正則,grep正則, sed使用及案例

战斗小人發表於2024-06-01

Shell正則

[root@shell01 shell13]# grep -E 'root|nginx|mysql|www' passwd萬用字元及特殊符號

*        #所有
.        #當前目錄
..        #當前目錄的上級目錄
-        #當前目錄的上一次所在的目錄
~        #家目錄
#        #註釋,超級管理員的命令列提示符
$        #引用變數,普通使用者的命令列提示符
?        #匹配任意一個字元,必須是一個
!        #非,取反
[]        #匹配中括號中任意一個字元
{}        #生成序列,整體
[^]        #排除中括號中所有字元
``        #優先執行反引號裡面的命令
$()        #優先執行裡面的命令
&&        #前面一個命令執行成功,才會執行後面的命令
||        #簽名的命令執行失敗,才會執行後面的命令
|        #管道,將前面的命令的輸出結果交給管道後面的命令
\        #跳脫字元,取消一些特殊字元的含義
&        #將程式放到後臺執行

正規表示式

注意事項:
正則神坑    中文字元

正則符號    基礎正則    擴充套件正則
RE            BRE            ERE

^        #開頭
$        #結尾
^$        #空行(有空格或tab鍵不算空行)
\        #跳脫字元
.        #任意一個字元,除了換行符
[]        #匹配中括號中的任意一個字元
[^]        #匹配[^]之外的所有字元
[a-z]    #匹配所有小寫字母
[0-9]
?        #匹配前面的字元出現0次或者1次        #擴充套件
*        #匹配前面的字元出現0次或者0次以上
+        #匹配前面的字元出現1次或者1次以上        #擴充套件
.*        #所有
()        #整體,後向引用,建立一個用於匹配的字串    #擴充套件
{n}        #n數字,前面的字元出現n次                #擴充套件
{n,}    #前面的字元至少出現n次                #擴充套件
{n,m}    #前面的字元出現至少n次,最多m次    n<m        #擴充套件
{,m}    #前面的字元最多出現m次                #擴充套件
|        #或者                                #擴充套件

特定的字元
[[:upper:]]        所有大寫字母
[[:lower:]]        所有小寫字母
[[:alpha:]]        所有字母
[[:space:]]        所有空白字元
[[:digit:]]        所有數字
[[:alnum:]]        所有字母和數字
[[:punct:]]        所有特殊符號

grep    #三劍客老三    過濾    過濾出來的內容是有顏色

[root@shell01 shell13]# alias
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'

選項:
    -i        #忽略大小寫
    -v        #排除
    -n        #顯示過濾出來的內容所在檔案的行號
    -c        #將過濾出來的內容進行統計
    -w        #精確匹配
    -o        #只顯示過濾出來的內容
    -E        #支援擴充套件正則
    -r        #遞迴過濾
    -R        #遞迴過濾
    -A        #顯示過濾出來的內容及向下多少行
    -B        #向上
    -C        #向上向下各多少行

#準備檔案
cp /etc/passwd ./

#過濾以什麼開頭的行
[root@shell01 shell13]# grep '^root' passwd
root:x:0:0:root:/root:/bin/bash

#過濾以什麼為結尾的行
[root@shell01 shell13]# grep 't$' passwd 
halt:x:7:0:halt:/sbin:/sbin/halt

#過濾出空行,並列印行號    -n顯示行號
[root@shell01 shell13]# grep -n '^$' passwd

#匹配任意一個字元,不匹配空行
[root@shell01 shell13]# grep '.' passwd

#匹配所有行,包括空行
[root@shell01 shell13]# grep '.*' passwd

# 取消特殊含義,匹配以.結尾行
[root@shell01 shell13]# grep '\.$' passwd

#匹配中括號中的任意一個字元,a開頭或者c開頭
[root@shell01 shell13]# grep '^[ac]' passwd
adm:x:3:4:adm:/var/adm:/sbin/nologin
cdm:x:3:4:adm:/var/adm:/sbin/nologin

#以ac開頭,加不加括號都行
[root@shell01 shell13]# grep '^(ac)' passwd

#排除中括號中的任意一個字元,排除a或者c開頭
[root@shell01 shell13]# grep '^[^ac]' passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

#統計出檔案中所有字母出現的次數,次數從大到小進行排列
# -o只顯示過濾出來的內容   uniq -c去重統計
[root@shell01 shell13]# grep -o '[a-Z]' passwd |sort |uniq -c|sort -rn
    101 n
     84 o
     73 s

#統計出檔案中所有單詞出現的次數,次數從大到小進行排列
#+號是擴充套件正則,需要用-E
[root@shell01 shell13]# grep -Eo '[a-Z]+' passwd |sort |uniq -c|sort -rn
     26 sbin
     24 x
     20 nologin
     10 var

#+和*的區別之處
[root@shell01 shell13]# grep 'a*' passwd 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@shell01 shell13]# grep -E 'a+' passwd 
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

#*和?的區別
[root@shell01 shell13]# grep -Eo 'a*' passwd 
a
aaa
[root@shell01 shell13]# grep -Eo 'a?' passwd 
a
a

#過濾出passwd檔案中數字為2位或者3位的數字
#這裡用w精確匹配, {}是擴充套件正則,要用-E
[root@shell01 shell13]# grep -Ew '[0-9]{2,3}' passwd 
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
#匹配數字位數出現2次
[root@shell01 shell13]# grep -Ew '[0-9]{2}' passwd 
#匹配數字出現5次以上
[root@shell01 shell13]# grep -Ew '[0-9]{5,}' passwd 
#前面的數字最多匹配2次,可以匹配0次
[root@shell01 shell13]# grep -Ew '[0-9]{,2}' passwd
[root@shell01 shell13]# grep -Ew '[0-9]{0,2}' passwd 

#過濾檔案中以r開頭的行,忽略大小寫
[root@shell01 shell13]# grep -i '^r' passwd
root:x:0:0:root:/root:/bin/bash
[root@shell01 shell13]# grep '^[rR]' passwd
#()號是一個整體,當中用|才是或
[root@shell01 shell13]# grep -E '^(r|R)' passwd

#過濾出檔案中包含root nginx mysql www等字串
[root@shell01 shell13]# grep -E 'root|nginx|mysql|www' passwd

#過濾出檔案中以root nginx mysql www開頭的行
[root@shell01 shell13]# grep -E '^root|^nginx|^mysql|^www' passwd
[root@shell01 shell13]# grep -E '^(root|nginx|mysql|www)' passwd

#取IP地址
[root@shell01 shell13]# ifconfig |grep -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' -o

#檔案中匹配出正確的身份證號碼
[root@shell01 shell13]# grep -Ew '[0-9]{17}[0-9x]{1}' id.txt

Shell正則之Sed

三劍客的老二    擅長替換

流編輯器    非互動式的編輯器

Sed的工作原理
sed命令按照行進行處理內容。處理檔案時,首先會將第一行取出放在一個緩衝區,這個緩衝區我們稱之為模式空間。

sed進行處理。如果行匹配處理完成之後將之輸出到螢幕,如果行不匹配,將之丟棄。接著處理下一行。同樣的操作,直到檔案結束。檔案的內容其實並沒有改變。如果想真正的改變,需要加上-i選項。

sed是可以同時處理多個檔案的。

sed的語法:
sed        [選項]    command        files

sed正則使用,和grep相差不大

sed使用擴充套件正則時,需要使用-r選項

Sed的命令示例:
選項:        增刪改查
    -n        #取消預設輸出
    -i        #修改檔案內容
    -r        #支援擴充套件正則
    -e        #多項編輯
    
Sed 的內部命令
    a        #追加
    i        #插入(在上面追加)
    p        #列印
    d        #刪除
    s        #替換
    g        #全域性
    c        #在當前行位置進行替換
    !        #取反
    =        #顯示行號
    i        #忽略大小寫
    
    瞭解
    n        #讀入下一行,從下一行命令進行處理(N為上一行)
    h        #把模式空間的內容重定向到暫存緩衝區
    H        #把模式空間裡的內容追加到暫存緩衝區
    g        #取出暫存緩衝區的內容,將其複製到模式空間,覆蓋原處的內容
    G        #取出暫存緩衝區的內容,將其複製到模式空間,追加到原處的內容的後面


#輸出第三行 (預設會輸出所有內容,-n取消預設輸出)
[root@shell01 shell13]# sed -n '3p' /etc/passwd
daemon:x:2:2:daemon:/sbin:/sbin/nologin
#輸出2-10行
[root@shell01 shell13]# sed -n '2,10p' /etc/passwd
daemon:x:2:2:daemon:/sbin:/sbin/nologin

#刪除2-10行
[root@shell01 shell13]# sed -n '2,10d' /etc/passwd
#刪除第2行到結尾
[root@shell01 shell13]# sed -n '2,$d' /etc/passwd

#在第三行下面追加oldboy內容
[root@shell01 shell13]# sed -i '3a oldboy' passwd
#在第三行上面追加alex
[root@shell01 shell13]# sed -i '3i alex' passwd

#把第五行替換為lidao
[root@shell01 shell13]# sed '5c lidao' passwd

#找lp列印出來
[root@shell01 shell13]# sed -n '/lp/p' passwd

#在lp行下把spool換成alex    (-n取消預設輸出,就要有p,否則沒有輸出了)
[root@shell01 shell13]# sed -n '/lp/s#spool#alex#gp' passwd
lp:x:4:7:lp:/var/alex/lpd:/sbin/nologin

#匹配root行,刪除root行的下一行(沒用) (換成N就是上一行)
[root@shell01 shell13]# sed '/root/{n;d}' passwd
#替換匹配root行的下一行(沒用)
[root@shell01 shell13]# sed '/root/{n; s/bin/oldboy/}' passwd

#將第一行寫入暫存區,替換最後一行內容
[root@shell01 shell13]# sed '1h;$g' /etc/hosts
#將第一行寫入暫存區,在最後一行呼叫暫存區的內容
[root@shell01 shell13]# sed '1h;$G' /etc/hosts
#將第一行的內容刪除但保留至暫存區,在最後一行呼叫暫存區內容追加到尾部
[root@shell01 shell13]# sed -r '1{h;d};$G' /etc/hosts
#將第一行的內容寫入暫存區,從第二行開始往下全部替換
[root@shell01 shell13]# sed -r '1h;2,$g' /etc/hosts
#將第一行重定向到暫存區,2-3行追加到暫存區,最後追加呼叫暫存區的內容
[root@shell01 shell13]# sed -r '1h; 2,3H; $g' /etc/hosts

#示例:
#把定時任務裡的時間同步註釋
[root@shell01 shell13]# sed -n '/ntpdate/s#^##gp' /var/spool/cron/root
[root@shell01 shell13]# sed -n '/ntpdate/s/^/#/gp' /var/spool/cron/root
#把第二行註釋
[root@shell01 shell13]# sed -n '2s/^/#/gp' /var/spool/cron/root
#把第二行到結尾註釋
[root@shell01 shell13]# sed -n '2,$s/^/#/gp' /var/spool/cron/root
#將第2行到第6行前面新增#註釋符  &為追加的意思
[root@shell01 shell13]# sed -r '2,6s/.*/#&/' passwd

相關文章