grep命令是(global regular expression print,全局正则表达式输出)的缩写,它是Linux中功能最强大且最常用的命令之一。
grep在一个或多个输入文件中搜索与给定模式匹配的行,并将每条匹配行写入标准输出。 如果未指定文件,则grep将从标准输入读取,该输入通常是另一个命令的输出。
在本文中,我们将通过实际示例和最常见的GNU grep选项的详细说明,向您展示如何使用grep命令。
grep命令语法
grep命令的语法如下:
grep [OPTIONS] PATTERN [FILE...]
方括号中的项目是可选的。
OPTIONS - 零个或多个选项。 Grep包含许多控制其行为的选项。
PATTERN - 搜索模式。
FILE - 零个或多个输入文件名。
为了能够搜索文件,运行命令的用户必须对该文件具有读取权限。
在文件中搜索字符串
grep命令最基本的用法是在文件中搜索字符串(文本)。
例如,要显示/etc/passwd文件中包含字符串bash的所有行,请运行以下命令:
[linuxidc@localhost ~/www.linuxidc.com]$ grep bash /etc/passwd
输出应如下所示:
如果字符串包含空格,则需要将其用单引号或双引号引起来:
[linuxidc@localhost ~/www.linuxidc.com]$grep "Gnome Display Manager" /etc/passwd
反转匹配(排除)
要显示与模式不匹配的行,请使用-v(或--invert-match)选项。
例如,要打印不包含字符串nologin的行,可以使用:
[linuxidc@localhost ~/www.linuxidc.com]$grep -v nologin /etc/passwd
使用Grep过滤命令的输出
可以使用grep通过管道过滤命令的输出,并且只有与给定模式匹配的行才会打印在终端上。
例如,要找出哪些系统以用户www-data的身份在系统上运行,可以使用以下ps命令:
[linuxidc@localhost ~/www.linuxidc.com]$ps -ef | grep www-data
linuxidc 3980 3865 0 22:26 pts/1 00:00:00 grep --color=auto www-data
您也可以在命令中链接多个管道。 如您在上面的输出中看到的,还有一行包含grep进程。 如果您不希望显示该行,则将输出传递到另一个grep实例,如下所示。
[linuxidc@localhost ~/www.linuxidc.com]$ps -ef | grep www-data | grep -v grep
递归搜索
要递归搜索模式,请使用-r选项(或--recursive)调用grep。 使用此选项时,grep将搜索指定目录中的所有文件,并跳过递归遇到的符号链接。
要跟随所有符号链接,请使用-R选项(或--dereference-recursive),而不是-r。
这是显示如何在/etc目录内的所有文件中搜索字符串linuxidc的示例:
[root@localhost /home/linuxidc/www.linuxidc.com]$grep -r linuxidc /etc
输出将包含以文件的完整路径为前缀的匹配行:
如果使用-R选项,则grep将跟随所有符号链接:
[root@ ]$grep -R linuxidc.com /etc
注意下面输出的最后一行。 当用-r调用grep时,不会打印该行,因为Nginx启用站点的目录中的文件是指向可用站点目录中的配置文件的符号链接。
/etc/hosts:127.0.0.1 node2.linuxidc.com
/etc/nginx/sites-available/linuxidc.com: server_name linuxidc.com ;
/etc/nginx/sites-enabled/linuxidc.com: server_name linuxidc.com ;
仅显示文件名
要取消默认grep输出并仅打印包含匹配模式的文件名,请使用-l(或--files-with-matches)选项。
以下命令在当前工作目录中搜索所有以.conf结尾的文件,并仅显示包含字符串linuxidc.com的文件的名称:
$grep -l linuxidc.com *.conf
输出将如下所示:
tmux.conf
haproxy.conf
-l选项通常与递归选项-R结合使用:
$grep -Rl linuxidc.com /tmp
不区分大小写的搜索
默认情况下,grep区分大小写。 这意味着将大写和小写字符视为不同的字符。
要在搜索时忽略大小写,请使用-i选项(或--ignore-case)调用grep。
例如,当搜索不带任何选项的Zebra时,以下命令将不显示任何输出,即有匹配的行:
$grep Zebra /usr/share/words
但是,如果使用-i选项执行不区分大小写的搜索,则它将同时匹配大小写字母:
$grep -i Zebra /usr/share/words
指定“ Zebra”将匹配该字符串的“ zebra”,“ ZEbrA”或任何其他大小写字母组合。
zebra
zebra's
zebras
搜索全词
搜索字符串时,grep将显示该字符串嵌入较大字符串中的所有行。
例如,如果您搜索“ gnu”,则将以较大的单词(例如“ cygnus”或“ magnum”)嵌入“ gnu”的所有行都将匹配:
$grep gnu /usr/share/words
cygnus
gnu
interregnum
lgnu9d
lignum
magnum
magnuson
sphagnum
wingnut
要仅返回指定字符串是整个单词(用非单词字符括起来)的那些行,请使用-w(或--word-regexp)选项。
文字字符包括字母数字字符(a-z,A-Z和0-9)和下划线(_)。 所有其他字符均视为非单词字符。
如果您运行与上述相同的命令,包括-w选项,则grep命令将仅返回其中包含gnu作为单独单词的那些行。
$grep -w gnu /usr/share/words
gnu
显示行号
-n(或--line-number)选项告诉grep显示包含与模式匹配的字符串的行的行号。 使用此选项时,grep将匹配项打印到以行号为前缀的标准输出。
例如,要显示/etc/services文件中的包含字符串bash并带有匹配行号的行,可以使用以下命令:
[linuxidc@localhost etc]$ grep -n 10000 /etc/services
下面的输出显示在行10423和10424上找到匹配项。