1、字符匹配:
" . ":匹配任意单个字符
“ 【】”:匹配指定范围内的任意单个字符
“ ^”:匹配指定范围外的任意单个字符
【:digit:】:数字
【:alpha:】:字母
【:alnum:】:数字和字母
【【:digit:】】:匹配任意数字,
【【:lower:】】:匹配小写字母,
【【:upper:】】:匹配大写字母
[root@localhost dev]# grep r..t /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
//输出以r开头,以t结尾的单词所在行
[root@localhost dev]# grep s[abcd]i /etc/passwd
//匹配以s开头,以i结尾,中间出现abcd中任意字母的,输出其所在行
[root@localhost ~]# grep r[[:alpha:]][[:alpha:]]t /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
//匹配所有以r开头,以t结尾,中间包含两个字母的单词,并输出其所在行
[root@localhost ~]# grep r[[:alpha:]]*t /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
//匹配所有以r开头,以t结尾的单词,并输出其所在行
2、匹配次数:
* (星):匹配 * 前面字符任意次数
.*:匹配任意长度的任意字符
\?:匹配前面的字符0次或1次
\ *:匹配一次或者多次
\ {m,n\ }:匹配 其前面的字符至少 m 次,至多 n 次
\ {0,n\ }:匹配至多n次
\ {m,\ }:至少m次
[root@localhost dev]# cat file
bcdy
sy
xxxxxxxxy
asd
yan
[root@localhost dev]# grep x*y file
bcdy
sy
xxxxxxxxy
yan
//匹配出现x任意次数,并且有y的输出
[root@localhost dev]# cat file
xxxxxxy
xxx
wxxy
bcs
bdfy
x
y
xy
[root@localhost dev]# grep "x\?y" file
xxxxxxy
wxxy
bdfy
y
xy
//只有有y就能匹配出来
3、位置锚定:
^;行首锚定
$:行尾锚定
^$:空行
^ [[:space:]]*$:空行或包括空白字符的行
词首锚定:\ < 或 \b
词尾锚定:\ > 或 \b
匹配完整单词:\ <索要匹配的单词\ >
[root@localhost dev]# grep r..t /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
[root@localhost dev]# grep bash$ /etc/passwd
root:x:0:0:root:/root:/bin/bash
//行尾锚定,以bash单词结尾的所在行整行输出
[root@localhost dev]# grep "\<root" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
//词首锚定
[root@localhost dev]# grep "\root\>" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
//词尾锚定
[root@localhost dev]# grep "\<root\>" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
//匹配完整单词
4、分组和引用:
\ (\ ):将一个或者多个字符捆绑在一起,当做一个整体进行处理
\(xy\)\ (zd\ )ab\1:把xy当做第一组,把zd当做第二组,取第一组
\1:引用第一个分组
[root@localhost dev]# grep l..e.*l..e test
he loves his lover
he likes his lover
she loves her lover
she likes her liker
[root@localhost dev]# grep "\(l..e\).*\1" test
he loves his lover
she loves her lover
she likes her liker
//匹配以 l 开头,其后出现 e 的单词作为第一组,\1 表示引用第一组,即表示结尾所匹配的单词应与第一组所匹配到的单词一样
练习:
1、显示/etc/passwd中不以/bin/bash结尾的行
[root@localhost dev]# grep -v /bin/bash$ /etc/passwd
2、找出/etc/passwd中两位数(或三位数)
[root@localhost dev]# grep "\<[0-9]\{2\}\>" /etc/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
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
//匹配二位数
[root@localhost dev]# grep -o "\<[0-9]\{2,3\}\>" /etc/passwd
//显示二位数或三位数及其所在行
3、找出ifconfig命令中IP地址
[root@localhost dev]# ifconfig ens33 |grep inet |grep -v inet6 |cut -b 14-30
192.168.134.112