0
点赞
收藏
分享

微信扫一扫

Linux文本三剑客超详细教程---grep

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

举报

相关推荐

0 条评论