Linux命令行文本处理工具 [LinuxCast视频教程]
目录:
- Grep命令语法
- 如何使用
grep搜索文件中的字符串 - 反转匹配(排除)
- 如何使用Grep在命令输出中搜索字符串
- 递归搜索
- 仅显示文件名
- 不区分大小写的搜索
- 搜索全词
- 显示行号
- 计数比赛
- 搜索多个字符串(模式)
- 静音模式
- 基本正则表达式
- 扩展正则表达式
- 比赛前打印线
- 比赛后打印线
- 结论
grep
命令代表“全局正则表达式打印”,是Linux中功能最强大且最常用的命令之一。
Grep在一个或多个输入文件中搜索与给定模式匹配的行,并将每条匹配行写入标准输出。 如果未指定文件,则
grep
将从标准输入读取,该输入通常是另一个命令的输出。
在本教程中,我们将通过实际示例向您展示如何使用
grep
命令,以及最常见的GNU
grep
选项的详细说明。
Grep命令语法
在开始使用
grep
命令之前,让我们先回顾一下基本语法。
grep
实用程序表达式采用以下形式:
grep PATTERN
方括号中的项目是可选的。
-
OPTIONS-零个或多个选项。 Grep提供了许多控制其行为的选项。PATTERN-搜索模式。FILE零个或多个输入文件名。
为了能够搜索文件,运行命令的用户必须对该文件具有读取权限。
如何使用
grep
搜索文件中的字符串
grep
命令最基本的用法是在文件中搜索字符串(文本)。
例如,要显示
/etc/passwd
文件中包含字符串
bash
,可以使用以下命令:
grep bash /etc/passwd
输出应如下所示:
root:x:0:0:root:/root:/bin/bash linuxize:x:1000:1000:linuxize:/home/linuxize:/bin/bash
如果字符串包含空格,则需要将其用单引号或双引号引起来:
grep "Gnome Display Manager" /etc/passwd
反转匹配(排除)
要显示与模式不匹配的行,请使用
-v
(或
--invert-match
)选项。
例如,要显示
/etc/passwd
文件中不包含字符串
nologin
,可以使用以下命令:
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 linuxize:x:1000:1000:linuxize:/home/linuxize:/bin/bash
如何使用Grep在命令输出中搜索字符串
可以不用指定输入文件,而可以将另一个命令的输出通过管道传递给
grep
,然后仅显示与给定模式匹配的行。
例如,要找出哪些系统以用户
www-data
身份在系统上运行,可以使用以下
ps
命令:
ps -ef | grep www-data
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
您也可以在命令中链接多个管道。 如您在上面的输出中看到的,还有一行包含
grep
进程。 如果您不希望显示该行,则将输出传递到另一个
grep
实例,如下所示。
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
)。
在以下示例中,我们在
/etc
目录内的所有文件中搜索字符串
linuxize.com
:
grep -r linuxize.com /etc
该命令将打印以文件完整路径为前缀的匹配行。
/etc/hosts:127.0.0.1 node2.linuxize.com /etc/nginx/sites-available/linuxize.com: server_name linuxize.com www.linuxize.com;
相反,如果使用
-R
选项,则使用
-R
选项,
grep
将跟随所有符号链接:
grep -R linuxize.com /etc
注意输出的最后一行。 在上面的示例中未打印该行,因为Nginx的
sites-enabled
目录内的文件是指向
sites-available
目录内的配置文件的符号链接。
/etc/hosts:127.0.0.1 node2.linuxize.com /etc/nginx/sites-available/linuxize.com: server_name linuxize.com www.linuxize.com; /etc/nginx/sites-enabled/linuxize.com: server_name linuxize.com www.linuxize.com;
仅显示文件名
要取消默认的
grep
输出并仅打印包含匹配模式的文件名,可以使用
-l
(或
--files-with-matches
)选项。
例如,在当前工作目录中搜索所有以
.conf
结尾的文件,并仅打印包含字符串
linuxize.com
的文件名:
grep -l linuxize.com *.conf
输出将如下所示:
tmux.conf haproxy.conf
-l
选项通常与递归选项
-R
结合使用:
不区分大小写的搜索
缺省情况下,
grep
命令区分大小写。 这意味着将大写和小写字符视为不同的字符。
要在搜索时忽略大小写,请使用
-i
选项(或
--ignore-case
)。
例如,当搜索不带任何选项的
Zebra
时,以下命令将不显示任何输出,即有匹配的行:
grep Zebra /usr/share/words
但是,如果使用
-i
选项执行不区分大小写的搜索,则它将同时匹配大小写字母:
grep -i Zebra /usr/share/words
指定“ Zebra”将匹配该字符串的“ zebra”,“ ZEbrA”或任何其他大小写字母组合。
搜索全词
搜索“ gnu”时,
grep
还将打印“ gnu”嵌入较大字词(例如“天鹅座”或“大酒瓶”)的行。
grep gnu /usr/share/words
cygnus gnu interregnum lgnu9d lignum magnum magnuson sphagnum wingnut
要仅返回指定字符串是整个单词(用非单词字符括起来)的那些行,请使用
-w
(或
--word-regexp
)选项。
az
,
AZ
和
0-9
)和下划线(
_
)。 所有其他字符均视为非单词字符。
grep -w gnu /usr/share/words
显示行号
要显示包含与模式匹配的字符串的行数,请使用
-n
(或
--line-number
)选项。 使用此选项时,
grep
会将匹配项打印到标准输出,并以在其上找到的行号作为前缀。
例如,要显示
/etc/services
文件中的包含字符串
bash
并带有匹配行号的行,可以使用以下命令:
grep -n 10000 /etc/services
下面的输出显示在行10423和10424上找到匹配项。
10423:ndmp 10000/tcp 10424:ndmp 10000/udp
计数比赛
要将匹配行的数量打印到标准输出,请使用
-c
(或
--count
)选项。
在下面的示例中,我们计算以
/usr/bin/zsh
为外壳的帐户数量。
grep -c '/usr/bin/zsh' /etc/passwd
搜索多个字符串(模式)
可以使用OR运算符
|
连接两个或多个搜索模式
|
。
默认情况下,
grep
将模式解释为基本正则表达式,其中的元字符(例如
|
失去其特殊含义,必须使用反斜杠版本。
在以下示例中,我们正在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
不要向终端(标准输出)写入任何内容。 如果找到匹配项,该命令将以状态
0
退出。 在要检查文件是否包含字符串并根据结果执行特定操作的shell脚本中使用
grep
时,此功能很有用。
这是一个在安静模式下使用
grep
作为
if
语句中的测试命令的示例:
if grep -q PATTERN filename then echo pattern found else echo pattern not found fi
基本正则表达式
GNU Grep具有两个正则表达式功能集,即Basic和Extended。 默认情况下,
grep
将模式解释为基本正则表达式。
在基本正则表达式模式下使用时,除元字符以外的所有其他字符实际上都是与自己匹配的正则表达式。 以下是最常用的元字符的列表:
-
使用
^(脱字符号)符号可在行首匹配表达式。 在以下示例中,字符串^kangaroo仅在出现在行的开头时才匹配。grep "^kangaroo" file.txt使用
$(美元)符号来匹配行尾的表达式。 在下面的示例中,仅当字符串kangaroo$出现在行的最后时才匹配。grep "kangaroo$" file.txt使用
.(句点)符号以匹配任何单个字符。 例如,要匹配以kan开头且具有两个字符并以字符串roo结尾的任何内容,可以使用以下模式:grep "kan..roo" file.txt采用
(括号)以匹配括号中包含的任何单个字符。 例如,找到包含accept或“accent”的行,可以使用以下模式:grep "accet" file.txt采用
(括号)以匹配括号中包含的任何单个字符。 以下模式将匹配包含co(any_letter_except_l)a的字符串的任何组合,例如coca,cobalt等,但不会匹配包含cola的行,grep "coa" file.txt
要转义下一个字符的特殊含义,请使用
\
(反斜杠)符号。
扩展正则表达式
要将模式解释为扩展的正则表达式,请使用
-E
(或
--extended-regexp
)选项。 扩展的正则表达式包括所有基本元字符,以及用于创建更复杂和更强大的搜索模式的其他元字符。 以下是一些示例:
-
匹配并提取给定文件中的所有电子邮件地址:
grep -E -o "\b+@+\.{2, 6}\b" file.txt匹配并提取给定文件中的所有有效IP地址:
grep -E -o '(25|2|??)\.(25|2|??)\.(25|2|??)\.(25|2|??)' file.txt
-o
选项仅用于打印匹配的字符串。
比赛前打印线
要在匹配的行之前打印特定数量的行,请使用
-B
(或
--before-context
)选项。
例如,要在匹配的行之前显示五行前导上下文,可以使用以下命令:
比赛后打印线
要在匹配的行之后打印特定数量的行,请使用
-A
(或
--after-context
)选项。
例如,要在匹配的行之后显示五行尾随上下文,可以使用以下命令:
结论
grep
命令允许您在文件内部搜索模式。 如果找到匹配项,则grep将打印包含指定模式的行。
在“ Grep用户手册”页面上,还有更多有关Grep的知识。
grep终端






