linux命令之正则匹配grep
1.1 字符
1.1.1 特定字符:''
包含"root"的字符
[niewj@niewj ~]$ grep 'root' passwd
root:x:0:0:root:/root:/bin/bash
1.1.2 范围字符:[]
包含数字+大小写字母的字符
grep '[0-9a-zA-Z]' passwd
1.1.3 任意字符 .
[niewj@niewj ~]$ grep '.' passwd
会全部过滤出来
1.1.4 取反 [^]
[niewj@niewj ~]$ grep '[^a-zA-Z0-9:/-]' passwd
不包含大小写字母、不包含数字、不包含冒号、不包含斜杠、不包含横杠的结果。
1.2 边界字符^$
1.2.1 头字符^和尾字符$
以ftp开头
[niewj@niewj ~]$ grep '^ftp' passwd
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
以false结尾
[niewj@niewj ~]$ grep 'false$' passwd
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/false
空白行: '^$'
[niewj@niewj ~]$ grep '^$' passwd
1.3 元字符\w\W
1.3.1 字母数字下划线\w
相当于 grep '[a-zA-Z0-9_]' passwd
[niewj@niewj ~]$ grep '\w' passwd
1.3.1 非字母数字下划线\W
相当于 grep '[^a-zA-Z0-9_]' passwd
[niewj@niewj ~]$ grep '\W' passwd
1.4 单词分割元字符\b
[niewj@niewj ~]$ grep '\bx\b' passwd
// 这样就不会过滤出这样的行了:/var/spool/postfix:/sbin/nologin
1.5 重复字符表示
1.5.1 字符串
普通字符串,比如:'root', 'r..t'等;
要过滤两个数字相连的,错误方式: [niewj@niewj ~]$ grep '0-9' passwd
正确方式:加上单词分割字符
[niewj@niewj ~]$ 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个或者多个
[niewj@niewj ~]$ 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个或者多个,(注意:"+"前要加转义字符\)
[niewj@niewj ~]$ grep 'nie\+' test.txt
niewjhao hello
niee hao hello
niewj
nice niewj
niewjniewjniewj
#3. 包含"nie",且"e"有0个或者1个(注意:"?"前要加转义字符\)
[niewj@niewj ~]$ 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个或者多个
[niewj@niewj ~]$ grep '\(nie\)*' test.txt
// 略。因为0个会匹配到空行和所有
#2. 包含"nie",且"nie"有1个或者多个
[niewj@niewj ~]$ grep '\(nie\)\+' test.txt
niewjhao hello
niee hao hello
niewj
nice niewj
niewjniewjniewj
#3. 包含"nie",且"nie"有0个或者1个
[niewj@niewj ~]$ grep '\(nie\)\?' test.txt
// 略。因为0个会匹配到空行和所有
1.5.5 重复次数限制{n, m}
- * {0,}
- + {1,}
- ? {0, 1}
# "niewj"这个字符串出现1次到两次
[niewj@niewj ~]$ grep '\(niewj\)\{1,2\}' test.txt
niewjhao hello
niewj
nice niewj
niewjniewjniewj
这里会发现"niewjniewjniewj"其实是3次,但是也列出来了,这就是正则的"贪婪匹配模式",会进行多次匹配。
1.5.6 任意字符串注意贪婪模式
# 如果我们要找的是"niewj",下面不对,因为其匹配的其实是:"niewj:x:1000:1000::/home/niewj"
[niewj@niewj ~]$ grep 'n.*j' passwd
niewj:x:1000:1000::/home/niewj:/bin/bash
# 下面匹配到的才是正确的:2个"niewj"
[niewj@niewj ~]$ 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"的行,如果两者都需要,则使用逻辑或"|"
[niewj@niewj ~]$ 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-9
- 4-10位
- 数字开头数字结尾
所以是:grep '^[0-9]\{4,10\}$' qq.txt
[niewj@niewj ~]$ grep '^[0-9]\{4,10\}$' qq.txt
174375893
274958
1.7.2 匹配身份证号(15-18且支持X尾)
基本规则:
- 第一位不能是0
- 中间是13-16位数字
- 尾数是数字或"X"或"x"
[niewj@niewj ~]$ grep '^[1-9][0-9]\{13,16\}[0-9xX]$' qq.txt
12111319890202124X
123456789012345
123456789012345x
12345678901234x
345679876556890967
1.7.3 匹配密码规则
数字、字母、下划线组成、大于8位
[niewj@niewj ~]$ grep '^\w\{8,\}$' qq.txt
174375893
883a8585
12111319890202124X
123456789012345
123456789012345x
12345678901234x
345679876556890967
推荐阅读
面试题-JVM-005. 双亲委派模型及其缺陷以及SPI和Tomcat的类加载
[链接][链接][链接]什么是双亲委派模型?双亲委派模型优势?-1. 使得 Java 类随着它的类加载器一起具有一种带有优先级的层次关系,从而使得基础类得到统一-2. 避免了多份同样字节码的加载双亲委派模型缺陷?举例说...
niewj阅读 100
【关于Javascript】--- 正则表达式篇
基础知识一、元字符 {代码...} 二、量词 {代码...} 三、集合 字符类 {代码...} 四、分支 {代码...} 五、边界 开始结束 {代码...} 六、修饰符 {代码...} 七、贪婪模式和非贪婪模式js默认贪婪模式即最大可能的匹配...
Jerry赞 35阅读 2.9k
Bash 常用脚本片段
这段脚本非常有用,你只要在你的脚本开头加上下面的内容,就能以 --param value 的格式解析参数。由于这段脚本尽可能写的短小不占空间,所以格式方面会要求所有的参数都有值,例如不接受无参数的 --daemon,而必...
捏造的信仰赞 5阅读 1.7k评论 1
工具篇:iTerm与Zsh
iTerm2支持许多的主题配色,可以自己定义,也可以参考网上现成的主题配色。我个人比较喜欢draculatheme配色。支持item,vim,phpstorm , 下方存在主题官网路径,按照教程安装即可。
super白赞 4阅读 4.7k
深入剖析容器网络和 iptables
Docker 能为我们提供很强大和灵活的网络能力,很大程度上要归功于与 iptables 的结合。在使用时,你可能没有太关注到 iptables 的作用,这是因为 Docker 已经帮我们自动完成了相关的配置。
张晋涛赞 3阅读 1.3k
麒麟操作系统 (kylinos) 从入门到精通 - 常用软件安装 - 第三篇 常用软件安装(windows下的习惯)
本篇内容大部分从应用商店进行安装,部分通过官网下载,少部分通过命令行安装。1.原生应用1.1钉钉1.2飞书1.3 蓝信1.4 腾讯文档1.5 金山文档1.6 搜狗输入法(拼音)1.7 五笔输入法1.8 libreoffice官方也带了WPS,...
码上世界赞 3阅读 7.5k评论 17
JS核心知识点梳理——正则篇(下)
正则是一个前端必须掌握的知识。但是由于用的少,忘了记,记了忘,导致面试经常坐蜡。这里上篇先介绍正则的规则,下篇结合一些具体题目,带大家重新学习巩固一下正则,争取面试给自己加分。
Runningfyy赞 3阅读 2k
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。