Categories: Shell编程

linux grep命令详解

Linux和UNIX系统类似,所有系统配置信息都以纯文本形式存储和操作。因此,搜索文本将成为编辑和日志分析的常见任务。grep命令允许搜索文件中的文本或字符串,或从命令的输出控制台中搜索匹配正则表达式的术语或模式。当grep在一行中找到匹配项时,它会将结果复制到屏幕标准输出中。在本教程中,我们将通过实际示例学习如何使用grep命令。

Grep 命令

让我们先检查grep命令语法,然后再开始解释它的用法。

grep [OPTIONS] PATTERN [FILE...]

我们将详细讨论可用于搜索的最常见的grep选项和模式。

如何在文件中搜索字符串

在下面的示例中,grep在/etc/passwd文件中搜索字符串“root”,并将输出重定向到stdout。

$ grep "root" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

从多个文件中搜索文本

可以使用以下命令从多个文件中搜索特定文本:

$ grep "root" /etc/passwd /etc/group
/etc/passwd:root:x:0:0:root:/root:/bin/bash
/etc/passwd:operator:x:11:0:operator:/root:/sbin/nologin
/etc/group:root:x:0:root
/etc/group:bin:x:1:root,bin,daemon
/etc/group:daemon:x:2:root,bin,daemon
/etc/group:sys:x:3:root,bin,adm
/etc/group:adm:x:4:root,adm,daemon
/etc/group:disk:x:6:root
/etc/group:wheel:x:10:root

Grep不区分大小写搜索

选项-i不敏感地搜索给定的字符串/模式大小写。

在以下示例中,grep不敏感地匹配所有单词,如“hal”、“hal”大小写:

$ grep -i HAL /etc/passwd
halt:x:7:0:halt:/sbin:/sbin/halt
haldaemon:x:68:68:HAL daemon:/:/sbin/nologin

递归搜索

递归搜索是通过使用-r选项实现的,该选项将递归搜索跳过符号链接的所有文件。如果要包含符号链接,请使用-R。
在下面的示例中,grep命令将在/var目录中的所有文件中搜索字符串“ngnix”。

$ grep -r nginx /var

在命令输出(stdout)中搜索字符串

您可以对命令使用管道输出,对其输出的模式使用grep。在下面的示例中,我使用ls命令搜索名为“backup”的文件

$ ls | grep backup

在这里,我使用ps命令执行多管道并搜索“docker”和“apache”进程。

$ ps -ef | grep docker | grep apache

文件中的正则表达式

正则表达式是为每个输入行匹配的模式。Basic和Extended是grep命令使用的两个正则表达式。

基本正则表达式
默认情况下,grep将模式解释为基本正则表达式。
^(插入符号)符号-它后面的图案必须出现在每行的开头。在下面的示例中,字符串^welcome仅当出现在行首时才匹配。

$ grep “^welcome” filename

扩展正则表达式

如果希望grep将其理解为扩展正则表达式,请使用-E(或–extended regexp)选项。

以下命令将从文件中提取所有链接

$ grep –Eoi ']+>.*' filename

o:默认情况下,grep打印包含搜索模式的整行。此选项指示grep命令仅打印匹配的单词,而不是整行。
i:此选项要求grep命令在匹配模式时忽略大小写。

使用grep搜索完整单词

grep的-w(word regexp)标志将使给定的表达式只匹配整个单词。

$ grep -iw "samba" /etc/samba/smb.conf
# This is the main Samba configuration file. You should read the
# here. Samba has a huge number of configurable options (perhaps too
# For a step to step guide on installing, configuring and using samba,
# read the Samba-HOWTO-Collection. This may be obtained from:

在字符串匹配后显示行

-A选项,在字符串匹配后显示N行。

$ grep -A 2 "root" /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin

在字符串匹配之前显示行

我们可以使用-B选项在给定文件的字符串前显示N行

$ grep -B 2 "root" /etc/passwd
root:x:0:0:root:/root:/bin/bash
--
news:x:9:13:news:/etc/news:
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin

搜索多个字符串

我们可以使用or运算符|和|-E(扩展regexp)来搜索多个模式或字符串。E(扩展regexp)控制是否需要转义某些特殊字符。严格来说,E是指示要匹配的模式的标志。
示例1:使用-E选项

$ ls | grep -E “li|ovo”
linux24
ovo8_linux24.sh

Or

$ grep -E "foo|bar" *.txt

示例2:不使用-E选项

$ ls | grep ‘li\|ovo’
linux24
ovo8_linux24.sh

Or

$ grep "foo\|soul\|bar" *.txt

从搜索中排除特定文件

可以使用-v选项忽略搜索。以下命令将搜索除“syslog.log”之外的所有文件中的字符串“error”

$ grep -r error * | grep -v ‘/\syslog.log/’

总结

在本教程中,我们学习了如何使用grep命令在文件中查找文本

5.0
02
Mismatched anonymous define() module
Linux su命令详解
嘻嘻

嘻嘻IT: 笔者是一个工作七八年的程序猿老鸟,从事涉及的技术栈主要包括PHP、Linux、Devops等,喜欢研究新技术,尝试新技术,提升技术自动化和开发效率,致力于write less,do more! 技术每年都会层出不穷,领域划分的越来越细,不可能学习所有的东西,保持对技术的好奇心,理解技术中核心思想,做一个有深度,有思想的开发!

Recent Posts

CrowdStrike是一个AI云原生平台

CrowdStrike是全球网…

19小时 ago

Tabnine是一款AI编程助手

Tabnine是一款最新的AI…

2天 ago

Adrenaline一个AI开发工具

Adrenaline是一个革命…

2天 ago

Kubeflow一个简化Kubernetes学习工作流程工具

在机器学习(ML)领域,有效地…

2天 ago

CodiumAI一个AI测试工具

CodiumAI不完全依赖于手…

2天 ago

Writesonic一个AI创作助手

Writesonic是一个先进…

2天 ago