Linux 学习与进阶之三剑客其三 Grep
后知后觉 现有 2 评论

Grep是一个最初用于Unix操作系统的命令行工具。在给出文件列表或标准输入后,Grep 会对匹配一个或多个正则表达式的文本进行搜索,并只输出匹配(或者不匹配)的行或文本。

前言

历史

Grep 这个应用程序最早由 Ken Thompson (肯·汤普逊)写成。Grep原先是ed下的一个应用程序,名称来自于g/re/p(Globally search a Rregular Expression and Print,以正则表达式进行全局查找并打印)。在ed下,输入g/re/p这个命令后,会将所有匹配先定义样式的字符串,以行为单位打印出来。

小贴士:在 1973 年,UNIX 第四版中,grep 首次出现在 man 页面中。

命令结构

grep [options] 'command' file

参数说明

grep
    -v:取反
    -n:显示行号
    -o:显示过程
    -i:不区分大小写 --ignore-case
    -l:不显示找出的内容,只显示文件名
    -E:相当于 egrep ,可用扩展正则
    -A:显示找到的内容及接下来的N行
    -B:显示找到的内容及目标前的N行
    -C:显示找到的内容及前后的N行
    –P:使用 Perl 正则表达式

举个栗子

例 :获取系统 SELinux 状态

[root@localhost ~]# grep "^SELINUX=" /etc/selinux/config
SELINUX=enforcing

二、使用实例

例 1:

如何过滤出当前目录下某文件夹中的所有一级目录?(补充:不包含目录下面目录的子目录及隐藏目录,即只能是第一级目录)

[root@localhost ~]# ll | grep "^d"
drwxr-xr-x. 2 root root       71 Jul 15 15:26 test

解析:grep ^ 表示以XX开头,文件夹的第一列都是d 开头。

例 2:

查看 /etc/services15213306

[root@localhost ~]# grep -E "1521|3306" /etc/services
mysql           3306/tcp                        # MySQL
mysql           3306/udp                        # MySQL
ncube-lm        1521/tcp                # nCube License Manager
ncube-lm        1521/udp                # nCube License Manager

解析:|表示逻辑或,但是因为是扩展正则,因此需要使用-E参数。

例 3:

使用 w 命令获取用户数量

[root@localhost ~]# w | grep -Po '[0-9](?= users)'
4
[root@localhost ~]# w
 16:56:36 up  2:05,  4 users,  load average: 0.00, 0.01, 0.05
USER     TTY        LOGIN@   IDLE   JCPU   PCPU WHAT
kane     :0        14:51   ?xdm?  55.23s  0.14s gdm-session-worker [pam/gdm-password]
root     pts/0     14:51   45:32   0.06s  0.06s -bash
kane     pts/1     14:51    2:04m  0.02s  0.02s bash
root     pts/2     16:48    4.00s  0.05s  0.01s w

解析:零宽断言。

例 4:

获取 /etc/passwdroot 用户和 kane 用户所在行

[root@localhost ~]# grep -En "^root|^kane" /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
38:kane:x:1000:1000:kane:/home/kane:/bin/bash

解析:使用 -n 参数即可显示过滤出来的内容所在行号。

例 5:

假如忘记了 SELinux 配置文件的位置,请查找出文件位置

[root@localhost ~]# find /etc -type f | xargs grep "^SELINUX="
/etc/selinux/config:SELINUX=enforcing
[root@localhost ~]# find /etc -type f | xargs grep -l "^SELINUX="
/etc/selinux/config

解析:使用-l参数即可不显示过滤出来的关键字,只显示包含关键字的文件名。

例 6:

获取 /etc/passwdkane 用户所在行的上面两行

[root@localhost ~]# grep -nB2 "kane" /etc/passwd
36-sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
37-tcpdump:x:72:72::/:/sbin/nologin
38:kane:x:1000:1000:kane:/home/kane:/bin/bash

附录

参考链接

本文撰写于一年前,如出现图片失效或有任何问题,请在下方留言。博主看到后将及时修正,谢谢!
禁用 / 当前已拒绝评论,仅可查看「历史评论」。