linux命令 grep 非,在Linux系统下使用grep命令搜索文件的详细用法

本文介绍了Linux系统中grep命令的使用方法,包括基本搜索、反向匹配、搜索命令输出、递归搜索、不区分大小写、完全匹配、显示行号、计数、正则表达式等高级功能。通过示例展示了如何在文件和命令输出中高效地查找和过滤文本。
摘要由CSDN通过智能技术生成

在 Linux 系统下经常使用 grep 命令来搜索文件,它的全名是 global regular expression print(全局正则表达式打印),下面将介绍在 Linux 系统中使用 grep 命令进行搜索的详细用法。

grep 简介

grep 是 Linux 系统中最强大和最常用的命令之一。grep 可以搜索一个或多个(输入)文件,以查找与给定模式相匹配的行,并将每个匹配行写入标准输出。如果没有指定文件,grep 也可以将其它命令的输出作为标准输入进行读取。

参考:grep命令_Linux grep命令使用详解:强大的文本搜索工具

grep 命令语法

在讨论如何使用 grep 命令之前,让我们先回顾一下基本语法:

grep [OPTIONS] PATTERN [FILE...]

方括号中的项目是可选的:

1、OPTIONS 提供 grep 控制其行为的 0 个或多个选项。

2、PATTERN 搜索模式。

3、FILE 0 个或多个输入文件(名)。

使用 grep 在文件中搜索字符串

grep 命令最基本的用法就是在文件中搜索字符串(文本),例如要查看 /etc/passwd 文件中包含 zsh 的行,可以使用如下命令:

grep zsh /etc/passwd

713649377113fdac9c2a06cb01d29921.png

上图是 grep 在文件中搜索字符串。

如果要搜索的字符串包含空格,则需要将其用单引号或双引号括起来,例如:

grep "systemd Network Management" /etc/passwd

985af9c7b0c66b369482459572905214.png

上图是 grep 在文件中搜索字符串。

grep 反向匹配(排除)

如果要显示与搜索模式不匹配的行,可以使用 -v 或 –invert-match 参数。例如,要查看 /etc/passwd 文件中不包含 nologin 的行,可以使用以下命令:

grep -v nologin /etc/passwd

edad705900bc5506379dcfc2d897e678.png

上图是 grep 反向匹配。

grep 搜索另一命令的输出

如果不是搜索文件,也可以将其它命令的输出结果传递给 grep 作为其搜索的「输入」。例如,要查找当前 Linux 中以 www-data 用户运行的进程,可以执行如下命令:

ps -ef | grep www-data

d3267a2bf5684761a083c02bc6af2a11.png

上图是 grep 搜索另一命令的输出。

您还可以在命令中链接多个管道。从上图的输出中可以看到,有一行还包含了 grep 进程,如果不想显示该行,则可以将输出再次传递给另一个 grep 实例,例如:

7dc81f692dc28fa688e53564cd23e3cb.png

上图是 grep 搜索另一命令的输出。

grep 递归搜索

要使用递归搜索模式,请加上 -r 或 –recursive 参数,加上此参数后会搜索指定目录中的所有文件,遇到符号链接时会跳过。如果要搜索符号链接,需使用 -R 或 –dereference-recursive 参数。

在下面的示例中,我们会递归搜索 /etc 目录中所有包含 sysgeek_cn 的字符串:

grep -r sysgeek_cn /etc

该命令将输出包含字符串的行,并在前面显示其文件名。

d4199dca1a8f573df304338482759778.png

上图是 grep 递归搜索。

仅查看文件名

要禁止 grep 的默认输出,并仅显示包含匹配模式的文件名,可以使用 -l 或 –files-with-matches 参数。例如,要搜索当前目录中所有以 .conf 结尾并包含 sysgeek_cn 字符串的文件,可以执行:

grep -l sysgeek_cn *.conf

c9b0d640375e71db65b513a3fcc7af51.png

上图是 grep 仅查看文件名。

-l 参数通常会与递归参数 -R 结合使用,例如:

grep -Rl sysgeek_cn /tmp

配置 grep 不区分大小写

默认情况下,grep 是区分大小写的,也就是说大写和小写字符被视为不同。若要在搜索时忽略大小写,可以使用 -i 或 –ignore-case 参数。

grep 完全匹配

当用 grep 搜索 gnu 时,会自动匹配整个单词,如 cygnus 或 magnum:

grep gnu demo.txt

00b8af9a02fbbb4dd2dbd85b07d69515.png

上图是 grep 完全匹配。

如果要完全匹配搜索的单词字符,可以加上 -w 或 –word-regexp 参数。

单词字符包括:字母、数字(a-z、A-Z 和 0-9)和下划线(_)。 其它所有字符都被视为非单词字符。

如果加上 -w 参数执行上述 grep 命令,则仅返回 gnu 作为单独单词的那些行:

grep -w gnu demo.txt

b3f9dd3b8552ab08164ea2f44f7d73f8.png

上图是 grep 完全匹配。

配置 grep 显示行号

要显示搜索字符串所在文本的行数时,可以使用 -n 或 –line-number 参数,加上该参数后,grep 会将匹配内容打印到标准输出,并添加所在文本行号为前缀。

例如要查看 /etc/services 文件中 5222的所在行数,可以执行:

grep -n 5222 /etc/services

可以看到有 351 和 352 这两行:

c1ea23a232eff5808f296a826945abcc.png

上图是 grep 显示行号。

使用 grep 计数

若要对匹配的行进行计数,可以使用 -c 或 –count 参数,例如要查看当前 Linux 中使用 ZSH 的账户数,可以使用如下命令:

grep -c '/usr/bin/zsh' /etc/passwd

b5cbefad3e34a4f1390766c081f3675c.png

上图是 grep 计数。

grep 多个字符串(模式)

OR 运算符 | 可以连接两个或多个搜索模式。但默认情况下,grep 会将模式解释为基本正则表达式,其中元字符如 | 会失去其特殊意义,所以必需取反。

如下面的示例中,我们可以在 nginx 错误日志文件中搜索所有 fatal、error 和 critical 单词:

grep 'fatal/|error/|critical' /var/log/nginx/error.loge>

但如果加上扩展正则表达式参数 -E 或 –extended-regexp 参数,则运算符 | 不应取反,如下所示:

grep -E 'fatal|error|critical' /var/log/nginx/error.log

grep 正则表达式

grep 有基本和扩展两个正则表达式功能集,默认情况下,grep 的模式解释为基本正则表达式,要切换到扩展正则表达式需要加上 -E 参数。

当在基本模式下工作时,除元字符外的所有其他字符,都与原本的正则表达式相匹配。以下是最常用的元字符列表:

1、^(插入符号)用于匹配开头,例如 ^kangaroo 会匹配以其开头的行:

grep "^kangaroo" demo.txt

2、$(美元符号)用于匹配行尾巴,使用 kangaroo$ 仅在其出现在一行的最后才匹配:

grep "kangaroo$" demo.txt

3、.(句点)用以匹配任意单个字符,例如要匹配以 kan开头,中间有 2 个字符,然后以 roo结尾可以使用以下模式:

grep "kan..roo" demo.txt

4、[](中括号)用以匹配中括号里的任意单个字符,例如要匹配 accept 或 accent,可以使用以下模式:

grep "acce[np]t" demo.txt

要屏蔽字符的特殊含义,请使用 / 反斜杠。

grep 扩展正则表达式

扩展正则表达式包括所有基本元字符,以及其他扩展元字符,用以创建更复杂和强大的搜索模式。例如:

1、匹配并提取给定文件中的所有电子邮件地址:

grep -E -o "/b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+/.[A-Za-z]{2,6}/b" demo.txt

2、匹配并提取给定文件中的所有 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]?)' demo.txt

-o 参数用于仅打印匹配的字符串。

打印 grep 匹配行的后 N 行

要打印匹配行后 N 行,请使用 -A 或 –after-context 参数。例如要显示匹配行和后 5 行,可以使用以下命令:

grep -A 5 root /etc/passwd

c56ade68812ae362bbdffb2889182108.png

上图是 打印 grep 匹配行的后 N 行。

打印 grep 匹配行的前 N 行

要打印匹配行前 N 行,请使用 -B 或 –before-context 参数。例如要显示匹配行和前 3 行,可以使用以下命令:

grep -B 3 www-data /etc/passwd

533bf9ef5be900df2a060b332a7e496a.png

上图是 打印 grep 匹配行的前 N 行。

结语

以上就是 grep 命令的使用方法,配以图片便于理解。如果你想看更简单的使用方式,请参考:Linux grep命令示例。

TAG:

除非注明,文章均由 Linux系统学习 整理发布,欢迎转载。如有版权争议,请联系删除。

文章评论

留言与评论(共有 0 条评论)

验证码:

b2afe5d1fe9f478fafeb0d6ac357ee2a.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值