linux命令之正则匹配grep

niewj -
linux命令之正则匹配grep
1.1 字符1.1.1 特定字符:''包含"root"的字符
[[email protected] ~]$ grep 'root' passwd 
root:x:0:0:root:/root:/bin/bash
1.1.2 范围字符:[]

包含数字+大小写字母的字符

 grep '[0-9a-zA-Z]' passwd 
1.1.3 任意字符 .
[[email protected] ~]$ grep '.' passwd 
会全部过滤出来
1.1.4 取反 [^]
[[email protected] ~]$ grep '[^a-zA-Z0-9:/-]' passwd 
不包含大小写字母、不包含数字、不包含冒号、不包含斜杠、不包含横杠的结果。
1.2 边界字符^$1.2.1 头字符^和尾字符$以ftp开头
[[email protected] ~]$ grep '^ftp' passwd 
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
以false结尾
[[email protected] ~]$ grep 'false$' passwd 
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/false
空白行: '^$'
[[email protected] ~]$ grep '^$' passwd 
1.3 元字符\w\W1.3.1 字母数字下划线\w相当于 grep '[a-zA-Z0-9_]' passwd
[[email protected] ~]$ grep '\w' passwd
1.3.1 非字母数字下划线\W相当于 grep '[^a-zA-Z0-9_]' passwd
[[email protected] ~]$ grep '\W' passwd 
1.4 单词分割元字符\b
[[email protected] ~]$ grep '\bx\b' passwd 
// 这样就不会过滤出这样的行了:/var/spool/postfix:/sbin/nologin
1.5 重复字符表示1.5.1 字符串

普通字符串,比如:'root', 'r..t'等;

要过滤两个数字相连的,错误方式: [[email protected] ~]$ grep '0-9' passwd

正确方式:加上单词分割字符

[[email protected] ~]$ grep '\b[0-9][0-9]\b' passwd 
1.5.2 重复字符表示* 零次或多次+ 一次或多次?零次或一次

创建一个文本文件:test.txt

niewjhao hello
ni hao hello
niee hao hello

niewj
nice niewj

abcnilson

niewjniewjniewj

niniii
ni
nini
ninini

nij
ksdf
;ni
;
1.5.3 单个字符重复
#1. 包含"nie",且"e"有0个或者多个
[[email protected] ~]$ grep 'nie*' test.txt 
niewjhao hello
ni hao hello
niee hao hello
niewj
nice niewj
abcnilson
niewjniewjniewj
niniii
ni
nini
ninini
nij
;ni

#2. 包含"nie",且"e"有1个或者多个,(注意:"+"前要加转义字符\)
[[email protected] ~]$ grep 'nie\+' test.txt 
niewjhao hello
niee hao hello
niewj
nice niewj
niewjniewjniewj

#3. 包含"nie",且"e"有0个或者1个(注意:"?"前要加转义字符\)
[[email protected] ~]$ grep 'nie\?' test.txt 
niewjhao hello
ni hao hello
niee hao hello
niewj
nice niewj
abcnilson
niewjniewjniewj
niniii
ni
nini
ninini
nij
;ni
(注意:"?"前要加转义字符)(注意:"+"前要加转义字符)1.5.4 一组字符重复
#1. 包含"nie",且"nie"有0个或者多个
[[email protected] ~]$ grep '\(nie\)*' test.txt 
// 略。因为0个会匹配到空行和所有

#2. 包含"nie",且"nie"有1个或者多个
[[email protected] ~]$ grep '\(nie\)\+' test.txt 
niewjhao hello
niee hao hello
niewj
nice niewj
niewjniewjniewj

#3. 包含"nie",且"nie"有0个或者1个
[[email protected] ~]$ grep '\(nie\)\?' test.txt 
// 略。因为0个会匹配到空行和所有
1.5.5 重复次数限制{n, m}* {0,}+ {1,}? {0, 1}
# "niewj"这个字符串出现1次到两次
[[email protected] ~]$ grep '\(niewj\)\{1,2\}' test.txt 
niewjhao hello
niewj
nice niewj
niewjniewjniewj

这里会发现"niewjniewjniewj"其实是3次,但是也列出来了,这就是正则的"贪婪匹配模式",会进行多次匹配。

1.5.6 任意字符串注意贪婪模式
# 如果我们要找的是"niewj",下面不对,因为其匹配的其实是:"niewj:x:1000:1000::/home/niewj"
[[email protected] ~]$ grep 'n.*j' passwd 
niewj:x:1000:1000::/home/niewj:/bin/bash

# 下面匹配到的才是正确的:2个"niewj"
[[email protected] ~]$ grep '\bn[a-zA-Z]*j\b' passwd 
niewj:x:1000:1000::/home/niewj:/bin/bash
# 下面这两个也可以:
# grep 'n[a-zA-Z]*j' passwd
# grep 'n\w*j' passwd

grep 'n.*j' passwd 匹配要注意贪婪模式,如上面要取得"niewj"不能用".*"

1.6 逻辑或匹配|文本中包含"bin/false"的行,也有包含"bin/sync"的行,如果两者都需要,则使用逻辑或"|"
[[email protected] ~]$ grep 'bin/\(false\|sync\)' passwd 
sync:x:5:0:sync:/sbin:/bin/sync
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/false

上面例子表达的其实是: "bin/(false|sync)" 因为括号和"|"都需要转义,所以都加了转义字符。

1.7 几个案例1.7.1 匹配4-10位的QQ号

测试数据:qq.txt

asdkfjjd;k 578374

174375893

274958

ad8485

883a8585

12111319890202124X

123456789012345

123456789012345x

12345678901234x

345679876556890967

679

基本规则:

0-94-10位数字开头数字结尾

所以是:grep '^[0-9]\{4,10\}$' qq.txt

[[email protected] ~]$ grep '^[0-9]\{4,10\}$' qq.txt 
174375893
274958
1.7.2 匹配身份证号(15-18且支持X尾)

基本规则:

第一位不能是0中间是13-16位数字尾数是数字或"X"或"x"
[[email protected] ~]$ grep '^[1-9][0-9]\{13,16\}[0-9xX]$' qq.txt 
12111319890202124X
123456789012345
123456789012345x
12345678901234x
345679876556890967
1.7.3 匹配密码规则

数字、字母、下划线组成、大于8位

[[email protected] ~]$ grep '^\w\{8,\}$' qq.txt 
174375893
883a8585
12111319890202124X
123456789012345
123456789012345x
12345678901234x
345679876556890967
特别申明:本文内容来源网络,版权归原作者所有,如有侵权请立即与我们联系(cy198701067573@163.com),我们将及时处理。

Tags 标签

linuxgrep正则表达式

扩展阅读

加个好友,技术交流

1628738909466805.jpg