Linux学习|Gentoo/Arch/FreeBSD我爱编程

Linux“文本三剑客”之grep

2018-05-14  本文已影响12人  学渣角鹿白

grep,Global search REgular expression and Print out the line. 是Linux中常用的文本搜索工具,基于正则表达式(Regular Expression)和文本字符来编写模式(Pattern),然后根据指定的模式对目标文本逐行进行匹配,打印匹配到的行。

  1. grep工具分类
  2. grep命令
  3. 正则表达式
    (1) 基本正则表达式的元字符
    (2) 扩展正则表达式的元字符
  4. grep工具的应用实例

1. grep工具分类

grep工具共有三个:

  • grep - 默认支持基本正则表达式BRE;
  • egrep - 默认支持扩展正则表达式ERE;
  • fgrep - 默认不支持正则表达式。

虽然工具由三种,但三者都可以通过选项来达到彼此的使用效果:

  • grep
    (1) grep -E:相当于egrep
    (2) grep -F:相当于fgrep
  • egrep
    (1) egrep -G:相当于grep
    (2) egrep -F:相当于fgrep
  • fgrep
    (1) fgrep -G:相当于grep
    (2) fgrep -E:相当于egrep

所以一般只使用grep配合选项来达到不同的效果即可。
另外,如果需要进行文本搜索的是很大的文件,尽量使用fgrep或-F选项来直接匹配文本,不通过正则表达式处理,性能会有较大提高,f就是fast之意。

2. grep命令

grep还可以显示匹配到的行的上下文:
-A #:after:后#行
-B #:before:前#行
-C #:context:前后各#行

要用好grep等具有正则表达式引擎的工具,熟练应用正则表达式才是根本。

3. 正则表达式

正则表达式:Regular Expression,REGEXP。

正则表达式是由一类特殊字符及本本字符本身所编写的模式,其中有些字符不表示其字面意义,而是用于表示控制或通配的功能。

正则表达式分为两类:

基本正则表达式:BRE
扩展正则表达式:ERE

(1) 基本正则表达式的元字符

字符集:
[:digit:],[:lower:],[:upper:],[:alpha:],[:alnum:],[:punct:],[:space:],等等

这里强调一下LInux中单词的含义:非特殊字符组成的连续字符(字符串)都称为单词。
即:如果有特殊字符或空格出现,则单词中断。

分组括号中的模式匹配到的内容会被正则表达式引擎自动记录于内部的变量中,这些变量为:
\1:模式从左侧起,第一个左括号以及与之匹配的右括号之间的模式所匹配的字符
\2:模式从左侧起,第二个左括号以及与之匹配的右括号之间的模式所匹配的字符
\3
...

(2) 扩展正则表达式的元字符

扩展正则表达式的字符匹配元字符和基本正则表达式相同。

扩展正则表达式的位置锚定元字符和基本正则表达式相同。

后向引用元字符和基本正则表达式相同

4. grep工具的应用实例

  1. 显示/proc/meminfo文件中以大写或小写S开头的行;用两种方式
    第一种方式,直接使用grep工具:
    [root@localhost ~]# grep '^[s,S]' /proc/meminfo
    SwapCached: 0 kB
    SwapTotal: 975868 kB
    SwapFree: 975868 kB
    Shmem: 4684 kB
    Slab: 55728 kB
    SReclaimable: 20580 kB
    SUnreclaim: 35148 kB
    第二种方式,先用cat,然后通过管道将命令结果交给grep处理:
    [root@localhost ~]# cat /proc/meminfo | grep '^[s,S]'
    SwapCached: 0 kB
    SwapTotal: 975868 kB
    SwapFree: 975868 kB
    Shmem: 4684 kB
    Slab: 55880 kB
    SReclaimable: 20588 kB
    SUnreclaim: 35292 kB

  2. 显示/etc/passwd文件中其默认shell为非/sbin/nologin的用户
    [root@localhost ~]# grep -v '/sbin/nologin$' /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    sync:x:5:0:sync:/sbin:/bin/sync
    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    halt:x:7:0:halt:/sbin:/sbin/halt
    amandabackup:x:33:6:Amanda user:/var/lib/amanda:/bin/bash
    tomcat:x:91:91:Apache Tomcat:/usr/share/tomcat:/bin/nologin
    hadoop:x:1500:1500::/home/hadoop:/bin/bash

8、显示/etc/passwd文件中其默认shell为/bin/bash的用户;
[root@localhost ~]# grep '/bin/bash$' /etc/passwd
root:x:0:0:root:/root:/bin/bash
amandabackup:x:33:6:Amanda user:/var/lib/amanda:/bin/bash
hadoop:x:1500:1500::/home/hadoop:/bin/bash

9、找出/etc/passwd文件中的一位数或两位数;
[root@localhost ~]# grep -o "\<[[:digit:]]\{1,2\}\>" /etc/passwd
0
0
1
1
2
2
...

10、显示/boot/grub2/grub.conf中以至少一个空白字符开头的行
[root@localhost ~]# grep '^[[:space:]]\+' /boot/grub2/grub.cfg

11、显示/etc/rc.d/rc.local文件中以#开头,后面跟至少一个空白字符,而后又有至少一个非空白字符的行
[root@localhost ~]# grep '^#[[:space:]]\+[^[:space:]]' /etc/rc.d/rc.local
# THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES
# It is highly advisable to create own systemd services or udev rules
# to run scripts during boot instead of using this file.

12、打出netstat -tan命令执行结果中以‘LISTEN’,后跟空白字符结尾的行
[root@localhost ~]# netstat -tan | grep 'LISTEN[[:space:]]\+$'
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN
tcp6 0 0 :::22 :::* LISTEN
tcp6 0 0 ::1:25 :::* LISTEN
13、添加用户bash, testbash, basher, nologin (此一个用户的shell为/sbin/nologin),而后找出当前系统上其用户名和默认shell相同的用户的信息;
[root@localhost ~]# grep -E "(\<[[:alnum:]]+\>).*\1$" /etc/passwd
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
bash:x:1501:1501::/home/bash:/bin/bash
nologin:x:1504:1504::/home/nologin:/sbin/nologin

上一篇 下一篇

猜你喜欢

热点阅读