如何使用grep命令在文件中查找文本
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/’