如何使用grep命令在文件中查找文本

时间:2020-03-05 15:28:30  来源:igfitidea点击:

Linux和UNIX的系统,所有系统配置信息都以纯文本形式存储和操作。
因此,搜索文本将来自编辑和日志分析的非常常见的任务。

Grep命令允许搜索文件中的文本或者字符串或者从命令的输出控制台,术语或者模式匹配正则表达式。
当Grep在一行中查找匹配时,它将结果复制到屏幕中,即stdout。

在本教程中,我们了解如何使用实际示例使用Grep命令。

grep命令

让我们在开始解释其使用情况之前检查Grep命令语法。

grep [OPTIONS] PATTERN [FILE...]

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

如何在文件中搜索字符串

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

$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未受敏感的字符串/图案shell搜索。

在以下示例中,Grep与"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)

我们可以使用输出的管道从输出中使用该模式。

在以下示例中,我正在搜索使用ls命令的名称"备份"的文件

$ls | grep backup

其中我正在做多个管道,并从ps命令搜索"obacher"和'apache'进程。

$ps -ef | grep docker | grep apache

文件中的正则表达式

正则表达式是用于每个输入行的模式。
基本和扩展是Grep命令使用的两个正则表达式。

基本正则表达式

默认情况下,Grep将模式解释为基本正则表达式。

^(卡特)符号在每行的开头时必须发生在其后面的模式。
在以下示例中,字符串^欢迎将才会匹配它在一行的开始时发生。

$grep “^welcome” filename

扩展正则表达式

如果我们希望Grep将其视为扩展的正则表达式,请使用"-e"(或者-exted-regexp)选项"。

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

$grep –Eoi '<a[^>]+>.*</a>' 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 Jan be obtained from:

字符串匹配后的显示行

在字符串匹配后显示n的-a`选项。

$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

搜索多个字符串

我们可以使用或者运算符|和\ |搜索多种模式或者字符串。
-e(扩展regexp)控制是否需要逃脱某些特殊字符。
-e是严格的标志,用于指示我们想要匹配的模式。

示例1:使用-e选项

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

或者

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

例2:没有-e

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

或者

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

排除搜索特定文件

我们可以使用-v选项忽略搜索。
以下命令将在除"syslog.log"之外搜索所有文件中的字符串"错误"

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