9.1-9.3 正則介紹 grep上 中 下
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上 中 下