grep命令的全称是全局正则表达式打印,它是Linux中功能最强大且最常用的命令之一。
grep在一个或多个输入文件中搜索与指定模式匹配的行,并将匹配行写入标准输出。如果未指定文件,grep则从标准输入读取内容。
grep读取的标准输入通常是另一个命令的输出。在本教程中,我们将通过实际示例向您展示如何使用grep
命令,并详细说明最常用的GNU grep
选项。
grep 命令
在开始使用grep
命令之前,让我们先回顾一下grep基本语法。grep
命令表达式采用形式grep [OPTIONS] PATTERN [FILE...]
。
方括号中的选项是可选的。其中OPTIONS
可以零个或多个选项。Grep提供了个用于控制其行为的选项。
PATTERN
搜索模式,可以是正则表达式。FILE
零个或多个输入文件名。要能够搜索文件,运行命令的用户必须对该文件具有读取权限。
搜索字符串
grep命令的最基本用法是在文件中搜索字符串。例如,要搜索etc/passwd
文件包含字符串bash的行,请运行命令grep bash etc/passwd
。
如果字符串包含空格,则需要将其用单引号或双引号引起来,例如搜索Gnome Display Manager
,请运行命令grep "Gnome Display Manager" etc/passwd
。
grep bash etc/passwd
grep "Gnome Display Manager" etc/passwd
root:x:0:0:root:/root:/bin/bash
myfreax:x:1000:1000:myfreax:/home/myfreax:/bin/bash
grep排除与反转匹配
要显示与模式不匹配的行,请使用-v
/--invert-match
选项。例如,要打印etc/passwd
文件中不包含字符串nologin
的行。
请运行命令grep -v nologin etc/passwd
。
grep -v nologin etc/passwd
root:x:0:0:root:/root:/bin/bash
colord:x:124:124::/var/lib/colord:/bin/false
git:x:994:994:git daemon user:/:/usr/bin/git-shell
myfreax:x:1000:1000:myfreax:/home/myfreax:/bin/bash
grep 搜索标准输出
除了指定搜索文件之外,您还可以将另一个命令的标准输出传递给grep
,然后仅打印与指定模式匹配的行。
例如命令ps -ef | grep www-data
将查找系统以www-data
用户运行的进程,可以运行ps
命令然后通过管道传递给grep进行搜索没。
你可能没有注意到命令ps -ef | grep www-data
的标准输出还包含当前grep
进程的行。
如果您不希望显示该行,则可将标准输出再次通过管道传递到另一个grep实例排除grep进程的输出。例如命令ps -ef | grep www-data | grep -v grep
。
ps -ef | grep www-data
ps -ef | grep www-data | grep -v grep
www-data 18247 12675 4 16:00 ? 00:00:00 php-fpm: pool www
root 18272 17714 0 16:00 pts/0 00:00:00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn www-data
www-data 31147 12770 0 Oct22 ? 00:05:51 nginx: worker process
www-data 31148 12770 0 Oct22 ? 00:00:00 nginx: cache manager process
递归搜索
要使用递归搜索模式,请使用-r
/--recursive
选项。这将搜索指定目录中的所有文件,并跳过递归遇到的符号链接。
如果需要要跟踪所有符号链接,请使用-R
/--dereference-recursive
选项。
例如命令grep -r myfreax.com /etc
将在/etc
目录内搜索包含myfreax.com
字符串的所有文件。
命令将以文件的路径为前缀的打印匹配的行,并使用冒号分隔:
。你也可以使用-R
选项搜索所有符号链接的文件。
grep -r myfreax.com /etc
grep -R myfreax.com /etc
仅显示文件名
要取消默认的grep命令打印的输出,仅打印包含匹配模式的文件名,可以使用-l
/--files-with-matches
选项。
例如命令grep -l myfreax.com *.conf
将在当前工作目录中搜索所有以.conf
结尾的文件。并仅打印包含字符串myfreax.com
的文件名称。
你也可以组合-l
选项与-R
选项进行递归搜索文件。
grep -l myfreax.com *.conf
grep -Rl myfreax.com /tmp
tmux.conf
haproxy.conf
不区分大小写
默认情况下grep
命令区分大小写。这意味着将大写和小写字符视为不同的字符。
要在搜索时忽略大小写,请使用-i
/--ignore-case
选项。例如命令grep Zebra /usr/share/words
将搜索Zebra
,不显示任何输出。
但是,如果使用-i
选项执行不区分大小写的搜索,则它将同时匹配大小写字母。
grep Zebra /usr/share/words
grep -i Zebra /usr/share/words
zebra
zebra's
zebras
搜索全词
搜索gnu时,grep
还将打印gnu嵌入在较大字词的行,例如cygnus
或magnum
。要仅返回指定字符串是整个单词的行,请使用-w
/--word-regexp
选项。
单词字符包括字母数字字符a-z
,A-Z
和0-9
和下划线_
。所有其他字符都被视为非单词字符,例如$
等。
如果使用-w
选项运行与上述相同的命令,grep命令则将仅返回gnu
作为单独单词的行。
grep gnu /usr/share/words
grep -w gnu /usr/share/words
gnu
显示行号
要显示与模式匹配的行号,请使用-n
/--line-number
选项。使用此选项时,grep
将匹配项打印到标准输出,并以找到的行号作为前缀。
例如命令grep -n 10000 etc/services
,将在etc/services
文件搜索包含bash
字符的行。
以下输出显示在10423和10424行中找到的包含10000的行。
grep -n 10000 etc/services
10423:ndmp 10000/tcp
10424:ndmp 10000/udp
匹配统计
要打印与标准输出匹配的行数,请使用-c
/--count
选项。在以下示例中,我们统计以/usr/bin/zsh
为默认shell的帐户数量。
grep -c '/usr/bin/zsh' etc/passwd
4
多模式与字符串搜索
grep允许可以使用或运算符组合两个或多个搜索模式。
默认情况下,grep
将模式解释为基本正则表达式。诸如|
之类的元字符会失去其特殊含义,必须使用其反斜杠版本。
如果使用扩展的正则表达式选项-E
/--extended-regexp
,则不应对或运算符|
进行转义。
在下面的示例中,我们在Nginx错误日志文件中搜索单词fatal
,error
和critical
匹配的行。
grep 'fatal\\|error\\|critical' /var/log/nginx/error.log
grep -E 'fatal|error|critical' /var/log/nginx/error.log
静默模式
-q
/--quiet
选项指示grep
不向终端写入任何内容,通常是标准输出。如果搜索到匹配的行,grep命令的退出代码将会是0。
这在检查文件是否包含指定字符串,并根据结果执行某些操作的shell脚本中使用grep时,这会很有用。
这是在if
语句中使用grep静默模式作为测试命令的示例。
if grep -q PATTERN filename
then
echo pattern found
else
echo pattern not found
fi
正则表达式基础
GNU Grep具有两个正则表达式功能集,即Basic基本和Extended扩展。默认情况下,grep
将模式解释为基本正则表达式。
^
符号表示匹配行首,$
符号匹配行尾,.
符号以匹配任意单个字符,[ ]
中括号匹配指定范围的字符,[^ ]
以匹配非中括号内的任意字符。
要转义字符的特殊含义,请使用反斜杠符号\\
,例如要匹配符号$
,你将以这样的形式转义\\$
符号。
例如命令grep "^kangaroo" file.txt
,将匹配字符串行首是kangaroo
的行。命令grep "kangaroo$" file.txt
匹配行尾是kangaroo$
的行。
grep "^kangaroo" file.txt
grep "kangaroo$" file.txt
命令grep "kan..roo" file.txt
匹配kan
接着是两个任意字符,然后是roo
的行。命令grep "acce[np]t" file.txt
将会匹配accept
或accent
的行。
模式co[^l]a
将匹配包含co任何字符串a
的行,例如coca
,cobalt
等,但不匹配包含cola
的行。
grep "kan..roo" file.txt
grep "acce[np]t" file.txt
grep "co[^l]a" file.txt
扩展的正则表达式
要将模式解释为扩展的正则表达式,请使用-E
/--extended-regexp
选项。扩展的正则表达式包括所有基本元字符。以及用于创建更复杂搜索模式的其他元字符。
在指定文件中提取电子邮件地址
grep -E -o "\\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,6}\\b" file.txt
在指定的文件提取IP地址
grep -E -o '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)' file.txt
-o
选项用于仅打印匹配的字符串。
打印匹配行前半与后半部分
要在匹配行之前打印指定数量的行,请使用-B
/--before-context
选项。要在匹配的行之后打印指定数量的行,请使用-A
/--after-context
选项。
例如,要在匹配的行之前打印前五行,请运行命令grep -B 5 root etc/passwd
。
命令grep -A 5 root etc/passwd
在匹配的行之后显示尾随五行。这个有点类似在指定位置截断。
grep -B 5 root etc/passwd
grep -A 5 root etc/passwd
结论
grep
命令允许您在文件内部使用搜索模式。如果找到匹配项,则grep将打印包含指定模式的行。请访问Grep用户手册页面,了解Grep的更多信息。
-
Linux
+关注
关注
87文章
11088浏览量
207581 -
命令
+关注
关注
5文章
657浏览量
21911 -
grep
+关注
关注
0文章
22浏览量
4696
发布评论请先 登录
相关推荐
评论