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命令在文件中查找文本

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

发表我的评论

电子邮件地址不会被公开。 必填项已用*标注

ajax-loader