1. 程式人生 > >9.1-9.3 正則介紹 grep上 中 下

9.1-9.3 正則介紹 grep上 中 下

正則 grep

六周第一次課(3月12日)

9.1 正則介紹_grep上

9.2 grep中

9.3 grep下

擴展

把一個目錄下,過濾所有*.php文檔中含有eval的行

grep -r --include="*.php" 'eval' /data/




9.1 正則介紹_grep(上)


介紹

技術分享圖片

本章將要學習 grep/egrep、sed、awk

egrep是grep升級版

技術分享圖片

技術分享圖片



test1

[root@centos7 ~]# mkdir grep

[root@centos7 ~]# cd grep/

[root@centos7 grep]# cp /etc/passwd .

[root@centos7 grep]# ls

passwd

[root@centos7 grep]# grep 'nologin' passwd

技術分享圖片


grep自帶顏色高亮顯示

which grep可以看出高亮選項


#grep -c

行數

[root@centos7 grep]# grep -c 'nologin' passwd

15


#grep -n

行號

[root@centos7 grep]# grep -n 'nologin' passwd

技術分享圖片


#grep -i

不區分大小寫 (如果不加-i,有大寫的一行會被剝掉)

技術分享圖片


#grep -v 'nologin' passwd 取反

意思就是把除了nologin之外的行過濾出來

技術分享圖片


#grep -r

遍歷所有子目錄

技術分享圖片


-A 後面跟數字,過濾出符合要求的行及下面n行

[root@centos7 grep]# grep -nA2 'root' passwd

1:root:x:0:0:root:/root:/bin/bash

2-bin:x:1:1:bin:/bin:/sbin/nologin

3-daemon:x:2:2:daemon:/sbin:/sbin/nologin

--

10:operator:x:11:0:operator:/root:/sbin/nologin

11-games:x:12:100:games:/usr/games:/sbin/NOlogin

12-ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin


-B 同上,過濾出符合要求的行以及上面n行

[root@centos7 grep]# grep -nB2 'root' passwd

1:root:x:0:0:root:/root:/bin/bash

--

8-halt:x:7:0:halt:/sbin:/sbin/halt

9-mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

10:operator:x:11:0:operator:/root:/sbin/nologin


-C 同上,同時過濾出符合要求的行以及上下各n行

[root@centos7 grep]# grep -nC2 'root' passwd

1:root:x:0:0:root:/root:/bin/bash

2-bin:x:1:1:bin:/bin:/sbin/nologin

3-daemon:x:2:2:daemon:/sbin:/sbin/nologin

--

8-halt:x:7:0:halt:/sbin:/sbin/halt

9-mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

10:operator:x:11:0:operator:/root:/sbin/nologin

11-games:x:12:100:games:/usr/games:/sbin/NOlogin

12-ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin



9.2 grep(中)


示例

技術分享圖片


#grep '[0-9]' passwd

[n-n]裏面的數字是一個範圍值,'[0-9]'代表0-9其中一個字符。

技術分享圖片


# grep -v '[0-9]' passwd

[root@centos7 grep]# grep -v '[0-9]' passwd

那-v就是相反效果了,就是過濾沒有[0-9]的值。意思就是,帶數字的都不要。


#grep -n '^#高亮' passwd

^表示以什麽開頭。

把以#開頭的行過濾出來。

#grep -v '^#高亮' passwd

把不以#開頭的行過濾出來。

[root@centos7 grep]# vi inittab

在11行任意輸入純字母參數。

1 # inittab is no longer used when using systemd.

2 #

3 # ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.

4 #

5 # Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target

6 #

7 # systemd uses 'targets' instead of runlevels. By default, there are two main targets:

8 #

9 # multi-user.target: analogous to runlevel 3

10 # graphical.target: analogous to runlevel 5

11 asdkle

12 # To view current default target, run:

13 # systemctl get-default

14 #

15 # To set a default target, run:

16 # systemctl set-default TARGET.target

17 #


[root@centos7 grep]# grep -nv '^#' inittab

11:asdkle

第11行沒有以#開頭 所以被過濾出來。


[root@centos7 grep]# vi inittab

第十行增加數字加字母,第十五行添加純數字

技術分享圖片


註意,[^]裏面的^代表非,反義,取反的意思。例如[^0-9]代表非0-9,也算是非數字的意思。

但是,如果^[^0-9],[]外的^代表以xxx(具體看^後面參數)開頭,例如這裏^[^0-9]就是以非數字開頭的意思。


[root@centos7 grep]# grep '[^0-9]' inittab

過濾打印非數字的信息,註意:如果後面帶有字母的參數,此條件會成立,如果一行只是純數字,沒有帶任何字母或其他標點符號,則不成立。

技術分享圖片


[root@centos7 grep]# grep -nv '[^0-9]' inittab

15:22222222222

過濾非非數字的信息,-v非,[^]非負負得正,所以意思就是過濾數字的信息。紅色代表符合條件,白色表示不符合條件。


[root@centos7 grep]# grep '^[^0-9]' inittab

過濾打印以非數字開頭的信息。

技術分享圖片


[root@centos7 grep]# grep -nv ^'[^0-9]' inittab

10:111aaa

15:22222222222

過濾打印以數字開頭的信息。


總結:

取反,

例如 [^0-9] 那就是非數字(包括字母+特殊符號)

例如[^a-zA-Z] 那就是非字母(包括數字+特殊符號)

例如[^0-9a-zA-Z]那就是非數字字幕(特殊符號)


[^] 匹配非方括號裏面的內容。就是:只要不是方括號裏面的內容都打印出來。


^[^] 匹配非方括號裏面的內容開頭的所有字符。 只要不是方括號裏面的內容所開頭的,都打印出來。



9.3 grep(下)


示例介紹

技術分享圖片


'r.o'表示把r與o之間有一個任意字符的行過濾出來。

.表示任意一個字符,包括標點符號,數字和字母.


[root@centos7 grep]# grep 'r.o' passwd

root:x:0:0:root:/root:/bin/bash

operator:x:11:0:operator:/root:/sbin/nologin

#vi passwd添加幾行r.o相關的字符。

技術分享圖片


'o*o' *左邊的字符重復0-n次,*的右邊表示與結尾,也是o 前後匹配的。

[root@centos7 grep]# grep 'o*o' 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

123:rao

456:r>o

132:r1o

adm:x:3:4:adm:/var/adm:/sbin/nologin

lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown


[root@centos7 grep]# vi passwd

技術分享圖片


'.*'任意一個任意字符

技術分享圖片


例如 'aming.*bash'

[root@centos7 grep]# grep 'aming.*bash' passwd

aming:x:1000:1000::/home/aming:/bin/bash

技術分享圖片


#grep '{2}'不成立

#grep 'o{2}'不成立。如果用#egrep 'o{2}' 則成立。或者用#grep -E 'o{2}'。 -E代表egrep.

#grep 'o\{2\}'成立,\脫義,此參數表示過濾打印出現兩次o的信息。

技術分享圖片


[root@centos7 grep]# egrep 'o{2}' passwd

與#grep 'o\{2\}'用法一樣。

技術分享圖片


'o+o' +左邊的字符重復1-n次,+的右邊表示與結尾

#grep 'o\+o' passwd

#egrep 'o+o' passwd

結果與上述*實驗結果差不多。


+前後不一定都匹配。例如“o+t”

[root@centos7 grep]# grep 'o\+t' passwd

root:x:0:0:root:/root:/bin/bash

operator:x:11:0:operator:/root:/sbin/nologin

123:rooot


#egrep 'o?t' passwd

過濾打印t或者ot的結果。

技術分享圖片


#grep -E 'root|nologin' passwd

技術分享圖片

可以匹配多個或者條件。如果加-i 可以不區分大小寫,篩選範圍會增大。

[root@centos7 grep]# grep -E 'root|bus|997' passwd

root:x:0:0:root:/root:/bin/bash

operator:x:11:0:operator:/root:/sbin/nologin

dbus:x:81:81:System message bus:/:/sbin/nologin

polkitd:x:999:997:User for polkitd:/:/sbin/nologin


#egrep '(oo){2}' passwd 則表示一對oo出現2次,相當於o的2的倍數。如此類推。

技術分享圖片

9.1-9.3 正則介紹 grep上 中 下