1.grep
1.1 什么是grep和egrep
grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。
grep的工作方式是这样的,它在一个或多个文件中搜索字符串模板。如果模板包括空格,则必须被引用,模板后的所有字符串被看作文件名。搜索的结果被送到标准输出,不影响原文件内容。
可用于shell脚本,因为grep通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回0,如果搜索不成功,则返回1,如果搜索的文件不存在,则返回2。我们利用这些返回值就可进行一些自动化的文本处理工作。
egrep = grep -E:扩展的正则表达式 (除了\< , \> , \b 使用其他正则都可以去掉\)
1.2 使用grep
1.2.1 命令格式
grep [option] pattern file
用于过滤/搜索的特定字符。可使用正则表达式能多种命令配合使用,使用上十分灵活。
1.2.2 [option] 命令参数
常用参数已加粗
- -A<显示行数>:除了显示符合范本样式的那一列之外,并显示该行之后的内容。
- -B<显示行数>:除了显示符合样式的那一行之外,并显示该行之前的内容。
- -C<显示行数>:除了显示符合样式的那一行之外,并显示该行之前后的内容。
- -c:统计匹配的行数
- -e :实现多个选项间的逻辑or 关系
- -E:扩展的正则表达式
- -f FILE:从FILE获取PATTERN匹配
- -F:相当于fgrep
- -i --ignore-case #忽略字符大小写的差别。
- -n:显示匹配的行号
- -o:仅显示匹配到的字符串
- -q: 静默模式,不输出任何信息
- -r:递归搜索
- -s:不显示错误信息。
- -v:显示不被pattern 匹配到的行,相当于[^] 反向匹配
- -w :匹配 整个单词
1.2.3 常用的pattern(规则表达式)
- " " : 直接输入要匹配的内容,简单字符串可以不带双引号,复杂的字符串建议带上双引号
- ^ : 匹配以目标字符串开头的行
- $ : 匹配以目标字符串结尾的行
- . : 匹配一个非换行符的字符
- * : 匹配零个或多个先前字符
- .* : 匹配任意字符
- [] : 匹配一个指定范围内的字符
- [^]: 匹配一个不在指定范围内的字符
- \w : 匹配文字和数字字符,也就是[A-Za-z0-9]
- \W : w的反置形式,匹配一个或多个非单词字符,如点号句号等
1)字符匹配:
- . : 任意单个字符
- []:指定范围的字符
- [^]: 不在指定范围的字符
次数匹配:
- *:匹配前面字符任意次
- ? : 0 或1次
- +:1 次或多次
- {m}:匹配m次 次
- {m,n}:至少m ,至多n次
(2)位置锚定:
- ^:行首
- $: 行尾
- \<,<b:语首
- \>,<b:语尾
- 分组:()
- 后向引用:\1, \2, ...
- ^[[:space:]].*$ 空白行
(3)总结
除了\<, \b : 语首、\>, \b : 语尾;使用其他正则都可以去掉\;上面有演示案例,不在进行演示
1.3 grep实战演示
[root@DV-DPS-AP01 ~]# ifconfig
ens192: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.10.20.54 netmask 255.255.255.0 broadcast 10.10.20.255
inet6 fe80::5279:e5d6:2862:299d prefixlen 64 scopeid 0x20<link>
ether 00:50:56:9c:26:46 txqueuelen 1000 (Ethernet)
RX packets 42770826 bytes 8604632386 (8.0 GiB)
RX errors 0 dropped 182 overruns 0 frame 0
TX packets 153667 bytes 49079451 (46.8 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1 (Local Loopback)
RX packets 1152 bytes 284958 (278.2 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1152 bytes 284958 (278.2 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
virbr0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255
ether 52:54:00:c7:3e:04 txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
1.3.1 显示搜索字符串前后的行数
选项是–A=after, 和–B=before
[root@DV-DPS-AP01 ~]# ifconfig | grep -A 1 "10.10.20.54"
inet 10.10.20.54 netmask 255.255.255.0 broadcast 10.10.20.255
inet6 fe80::5279:e5d6:2862:299d prefixlen 64 scopeid 0x20<link>
[root@DV-DPS-AP01 ~]# ifconfig | grep -B 1 "10.10.20.54"
ens192: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.10.20.54 netmask 255.255.255.0 broadcast 10.10.20.255
1.3.2 打印匹配周围的行数
选项是–C 而是打印任一方向的行
[root@DV-DPS-AP01 ~]# ifconfig | grep -C 1 "10.10.20.54"
ens192: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.10.20.54 netmask 255.255.255.0 broadcast 10.10.20.255
inet6 fe80::5279:e5d6:2862:299d prefixlen 64 scopeid 0x20<link>
1.3.3 计算匹配次数
选项 -c 类似于管道grep字符串到字数(wcprogram) grep 的内置选项可以为您执行相同的操作 包含inet得行数
[root@DV-DPS-AP01 ~]# ifconfig |grep -c inet
5
1.3.4 正则表达式匹配多个关键词
选项 -E 或者 -e 包含inet或者inet6
[root@DV-DPS-AP01 ~]# ifconfig |grep -e inet -e inet6
inet 10.10.20.54 netmask 255.255.255.0 broadcast 10.10.20.255
inet6 fe80::5279:e5d6:2862:299d prefixlen 64 scopeid 0x20<link>
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255
[root@DV-DPS-AP01 ~]# ifconfig |grep -E "(inet|inet6)"
inet 10.10.20.54 netmask 255.255.255.0 broadcast 10.10.20.255
inet6 fe80::5279:e5d6:2862:299d prefixlen 64 scopeid 0x20<link>
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255
1.3.5 匹配不包含关键词的所有行
选项 -v 不包含字母e得行
[root@DV-DPS-AP01 ~]# ifconfig |grep -v e
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
virbr0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
1.3.6 进行精确匹配搜索
选项 -w
[root@DV-DPS-AP01 ~]# ifconfig | grep -w broadcast
inet 10.10.20.54 netmask 255.255.255.0 broadcast 10.10.20.255
inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255
1.3.7 在所有目录中递归搜索字符串
选项 –r 递归搜索的
[root@DV-DPS-AP01 logs]# grep -r 'hello' *
A1/testgrep.log:hello world
A2/testgrep.log:hello world
A3/A31/testgrep.log:hello world
A3/testgrep.log:hello world
testgrep.log:hello world