正則配合grep使用簡介


grep
grep: Global search REgular expression and Print out the line
做用:文本搜索工具,根據用戶指定的「模式」對目標文 本逐行進行匹配檢查;打印匹配到的行
模式:由正則表達式字符及文本字符所編寫的過濾條件
grep [OPTIONS] PATTERN [FILE...]
grep root /etc/passwd
grep "$USER" /etc/passwd
grep '$USER' /etc/passwd
grep `whoami` /etc/passwd

grep命令選項
--color=auto: 對匹配到的文本着色顯示
-v: 顯示不被pattern匹配到的行nginx

-i: 忽略字符大小寫git

-n:顯示匹配的行號
# grep -n root /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
10:operator:x:11:0:operator:/root:/sbin/nologin正則表達式

-c: 統計匹配的行數
# grep -c root /etc/passwd
2算法

-o: 僅顯示匹配到的字符串
grep -o root /etc/passwd
root
root
root
rootshell

-q: 靜默模式,不輸出任何信息 主要在腳本中使用,之查看匹配結果是否成功,並不關注匹配的結果
# grep -q root /etc/passwd
# echo $?
0
# grep -q root11 /etc/passwd
# echo $?
1
-A #: after, 後#行
# grep -nA3 root /etc/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
4-adm:x:3:4:adm:/var/adm:/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
13-nobody:x:99:99:Nobody:/:/sbin/nologinexpress

-B #: before, 前#行
# grep -nB3 root /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
--
7-shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
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/nologinvim

-C #:context, 先後各#行
# grep -nC3 root /etc/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
4-adm:x:3:4:adm:/var/adm:/sbin/nologin
--
7-shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
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
13-nobody:x:99:99:Nobody:/:/sbin/nologincentos

-e:實現多個選項間的邏輯or關係
# grep -e root -e haha /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
haha:x:1011:1011::/home/haha:/bin/bashbash

-w:整行匹配整個單詞
-E:使用ERE
-F:至關於fgrep,不支持正則表達式

正則表達式
REGEXP:由一類特殊字符及文本字符所編寫的模式,其中有些字符(元字符)不表示字符字面意義,而表示控制或通配的功能
程序支持:grep, vim, less,nginx等
分兩類:
基本正則表達式:BRE
擴展正則表達式:ERE
grep -E, egrep
正則表達式引擎:
採用不一樣算法,檢查處理正則表達式的軟件模塊
PCRE(Perl Compatible Regular Expressions)
元字符分類:字符匹配、匹配次數、位置錨定、分組
man 7 regex
字符匹配:
.匹配任意單個字符
[] 匹配指定範圍內的任意單個字符
[^] 匹配指定範圍外的任意單個字符
[:alnum:] 字母和數字
[:alpha:] 表明任何英文大小寫字符,亦即A-Z, a-z
[:lower:] 小寫字母[:upper:] 大寫字母
[:blank:] 空白字符(空格和製表符)
[:space:]水平和垂直的空白字符(比[:blank:]包含的範圍廣)
[:cntrl:] 不可打印的控制字符(退格、刪除、警鈴...)
[:digit:] 十進制數字
[:xdigit:]十六進制數字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 標點符號

匹配次數:用在要指定次數的字符後面,用於指定前面的字符要出現的次數
* 匹配前面的字符任意次,包括0次
貪婪模式:儘量長的匹配
.*任意長度的任意字符
\?匹配其前面的字符0或1次
\+匹配其前面的字符至少1次
\{n\}匹配前面的字符n次
\{m,n\}匹配前面的字符至少m次,至多n次
\{,n\}匹配前面的字符至多n次
\{n,\}匹配前面的字符至少n次
位置錨定:定位出現的位置
^ 行首錨定,用於模式的最左側
$ 行尾錨定,用於模式的最右側
^PATTERN$ 用於模式匹配整行
^$ 空行
^[[:space:]]*$ 空白行
\< 或\b詞首錨定,用於單詞模式的左側
\> 或\b詞尾錨定;用於單詞模式的右側
\<PATTERN\>匹配整個單詞
分組:\(\) 將一個或多個字符捆綁在一塊兒,看成一個總體進行處理,如:\(root\)\+
分組括號中的模式匹配到的內容會被正則表達式引擎記錄於內部的變量中,這些變量的命名方式爲: \1, \2, \3, ...
\1表示從左側起第一個左括號以及與之匹配右括號之間的模式所匹配到的字符
示例:\(string1\+\(string2\)*\)
1 :string1\+\(string2\)*
2 :string2
後向引用:引用前面的分組括號中的模式所匹配字符,而非模式自己

egrep及擴展的正則表達式
egrep= grep -E
egrep[OPTIONS] PATTERN [FILE...]
字符匹配:
. 任意單個字符
[] 指定範圍的字符
[^] 不在指定範圍的字符

次數匹配:
*:匹配前面字符任意次
?: 0或1次
+:1次或屢次
{m}:匹配m次
{m,n}:至少m,至多n次

位置錨定:
^ :行首
$ :行尾
\<, \b :詞首
\>, \b :詞尾

分組:
()
後向引用:\1, \2, ...

或者:
a|b: a或b
C|cat: C或cat
(C|c)at:Cat或catless

上面主要介紹正則的字符匹配,次數匹配,位置錨定,分組,或者等語法等。

下面主要介紹一個我在學習正則時的例子,以這個具體事例分析爲主來剖析。

例子:
使用正則取出/etc/passwd文件中系統用戶。(centos7系統用戶是UID等於0-999)

分析題目需求,尋找解決方案,正則思路其實不少,每一個人想出方法可能會各有不一樣,可是結果達就是成功。
這裏我提供下這道題個人思路:
1.首先咱們取出/etc/passwd文件中一行來看一看
root:x:0:0:root:/root:/bin/bash
用戶名:密碼佔位符:UID:GID:用戶完整信息:主目錄:默認shell版本

2.根據題目要求是要求咱們取出系統用戶名,centos7裏面系統用戶的UID是0-999,從上面兩條要求分析,從文件中咱們最少須要先取出用戶名(冒號分割第一段)和UID第三段。那麼咱們接下來目的就是取出文件中第一段和第三段內容,這裏咱們可使用cut命令來取。
# cut -d: -f1,3 /etc/passwd #關於cut命令說明請man cut
root:0
bin:1
daemon:2
adm:3
lp:4
sync:5
shutdown:6
halt:7
mail:8
operator:11
games:12
ftp:14
nobody:99
systemd-bus-proxy:999
systemd-network:192
dbus:81
polkitd:998
abrt:173
unbound:997
usbmuxd:113
tss:59
libstoragemgmt:996
rpc:32
colord:995
amandabackup:33
saslauth:994
geoclue:993
setroubleshoot:992
rtkit:172
qemu:107
radvd:75
chrony:991
ntp:38
sssd:990
rpcuser:29
nfsnobody:65534
pulse:171
gdm:42
gnome-initial-setup:989
avahi:70
postfix:89
sshd:74
tcpdump:72
xiangge:1000
yongge:1001
newxiangge:1010
haha:1011
hehe:1012

3.繼續往下分析咱們題目要求是取UID 0-999的用戶,那麼咱們如今須要作的就是從咱們第一次取出的結果裏面在把包含數字小於999的行取出來就好了。
怎麼取?咱們大概來分析0-999這些數字特色:1-3位數字組成,出如今每行的行尾,而且爲最後一個單詞。

大概思路:先字符匹配----》再作次數匹配------》最後作位置錨定

1.)字符匹配
首先把我須要匹配內容的組成字符匹配出來,這個例子咱們是須要取內容只包含數字,那麼咱們匹配出數字就好,根據上面字符介紹咱們大概知道匹配數字方式有兩種第一種[0-9]或者[:digit:],選擇一種本身喜歡的使用就好。

2.)次數匹配
匹配完字符咱們接着就是須要匹配咱們組成部分裏面每種字符出現次數,在相應字符後面加上次數匹配就好,這個例子裏面數字出現次數是1-3次那麼咱們在咱們相應的字符後面加上咱們次數匹配1-3.

3.)位置錨定
字符和次數匹配完後,咱們須要作的就是位置錨定了,從上面結果分析咱們須要取出0-999數,這些數是出如今咱們須要匹配文本那些位置?
nobody:99
systemd-bus-proxy:999
從上面兩個例子能夠得出咱們須要取出數字是出如今每行的行尾那麼行尾須要錨定,可是若是僅僅只是作一個行尾錨定就行?咱們看下執行結果再來分析下
# cut -d: -f1,3 /etc/passwd|grep "[0-9]\{1,3\}$"
可是結果中卻出現下面這種狀況,明顯就是咱們範圍大了想辦法縮小的取範圍,咱們目標是取出1-3位數字組成的單詞而且這個單詞必須行尾,像65534一個完整的單詞是65534,可是咱們須要去的結果534只是出如今這個單詞中間某段,明顯不符合咱們取目標是一個完整單詞,這明顯不是咱們想要的結果,那麼怎麼才能達到咱們的要求?
nfsnobody:65534
xiangge:1000
yongge:1001
newxiangge:1010
haha:1011
hehe:1012

解決上面方法就是咱們把詞首錨定下,問題就解決了
# cut -d: -f1,3 /etc/passwd|grep "\b[0-9]\{1,3\}$"
root:0
bin:1
daemon:2
adm:3
lp:4
sync:5
shutdown:6
halt:7
mail:8
operator:11
games:12
ftp:14
nobody:99
systemd-bus-proxy:999
systemd-network:192
dbus:81
polkitd:998
abrt:173
unbound:997
usbmuxd:113
tss:59
libstoragemgmt:996
rpc:32
colord:995
amandabackup:33
saslauth:994
geoclue:993
setroubleshoot:992
rtkit:172
qemu:107
radvd:75
chrony:991
ntp:38
sssd:990
rpcuser:29
pulse:171
gdm:42
gnome-initial-setup:989
avahi:70
postfix:89
sshd:74
tcpdump:72

上面若是你不想使用詞首錨定,也可使用grep -w 匹配單詞,也能達到咱們想要的結果。
# cut -d: -f1,3 /etc/passwd|grep -w "[0-9]\{1,3\}$"

以上爲我處理這個題目的思路,能夠嘗試使用我推薦這個思路去練習,我我的感受這個方法能夠很清晰的分析出咱們通常的正則基本規則,從而匹配出咱們想要的結果。

最後能夠嘗試使用上面思路去過濾出ifconfig命令查看的結果中全部的IP地址。下面提供一個我我的答案,能夠按這個思路去思考下。# ifconfig|egrep -o "([0-9]+\.){3}[0-9]{1,3}"192.168.31.32255.255.255.0192.168.31.255192.168.199.156255.255.255.0192.168.199.255127.0.0.1255.0.0.0192.168.122.1255.255.255.0192.168.122.255

相關文章
相關標籤/搜索