前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >是真的很详细了!Linux中的Grep命令使用实例

是真的很详细了!Linux中的Grep命令使用实例

作者头像
用户6543014
发布2019-12-17 12:08:21
55.4K0
发布2019-12-17 12:08:21
举报
文章被收录于专栏:CU技术社区CU技术社区

在本教程中,您将学习如何在Linux中使用非常重要的grep命令。我们将讨论为什么此命令至关重要,以及如何在命令行中将其用于日常任务中。让我们深入了解一些解释和示例。

目录

  1. 为什么我们使用grep?
  2. 查找字符串
  3. 查找多个字符串
  4. grep egrep fgrep pgrep zgrep之间的区别
  5. find和grep之间的区别
  6. 递归搜索
  7. 填充空间或制表符
  8. 使用正则表达式
  9. 9个Grep gz文件,无需解压缩
  10. zip文件中的10个Grep电子邮件地址
  11. Grep IP地址
  12. Grep or条件
  13. 忽略大小写
  14. 搜索时区分大小写
  15. Grep精确匹配
  16. 排除模式
  17. Grep和替换
  18. 带行号的Grep
  19. 显示之前和之后的行数
  20. 对结果排序

我们为什么要使用grep?

Grep是Linux用户用来搜索文本字符串的命令行工具。您可以使用它在文件中搜索某个单词或单词的组合,也可以将其他Linux命令的输出通过管道传输到grep,因此grep可以仅显示您需要查看的输出。

让我们看一些非常常见的例子,假设您需要检查目录的内容以查看那里是否存在某个文件,那就是您要使用“ ls”命令进行操作的目的。

但是,为了使检查目录内容的整个过程更快,您可以将ls命令的输出传递给grep命令,让我们在主目录中查找一个名为Documents的文件夹。

现在,让我们尝试再次检查目录,但是这次使用grep专门检查Documents文件夹。

代码语言:javascript
复制
$ ls | grep Documents

如您在上面的屏幕截图中所见,使用grep命令可以通过快速将搜索到的单词与ls命令产生的其余不必要输出隔离开来,从而节省了我们的时间。

如果“Documents”文件夹不存在,则grep不会返回任何输出。因此,如果grep没有返回任何内容,则意味着它找不到您正在搜索的单词。

查找字符串

如果您需要搜索文本字符串而不是单个单词,则需要将字符串用引号引起来。例如,如果我们需要搜索“My Documents”目录而不是单词“Documents”目录怎么办?

代码语言:javascript
复制
$ ls | grep 'My Documents'

grep的字符串Grep会同时接受单引号和双引号,因此请用其中任意一个将文本字符串包裹起来。

虽然grep通常用于搜索从其他命令行工具管道传输的输出,但是您也可以使用它直接搜索文档。下面是一个我们在文本文档中搜索字符串的示例。

代码语言:javascript
复制
$ grep 'Class 1' Students.txt

查找多个字符串

您也可以使用grep查找多个单词或字符串。您可以使用-e开关指定多个模式。让我们尝试在文本文档中搜索两个不同的字符串:

代码语言:javascript
复制
$ grep -e 'Class 1' -e Todd Students.txt

注意,我们只需要在包含空格的字符串周围使用引号。

grep egrep fgrep pgrep zgrep之间的区别

不同的grep开关都包含在不同的二进制文件中。在现代Linux系统上,您可以在基本的grep命令中找到这些开关,但是常见的是发行版也支持其他命令。

在grep的手册页中:

代码语言:javascript
复制
$ egrep is the equivalent of grep -E

此开关会将模式解释为扩展的正则表达式。您可以执行许多不同的操作,但是这里有一个示例,说明将正则表达式与grep一起使用的样子。

让我们在文本文档中搜索包含两个连续的“ p”字母的字符串:

代码语言:javascript
复制
  $ egrep p\{2} fruits.txt

要么

代码语言:javascript
复制
$ grep -E p\{2} fruits.txt

代码语言:javascript
复制
$ fgrep is the equivalent of grep -F

此开关会将模式解释为固定字符串的列表,并尝试匹配其中的任何一个。当您需要搜索正则表达式字符时,此功能非常有用。这意味着您不必像常规grep那样转义特殊字符。

pgrep是用于搜索系统上正在运行的进程的名称并返回其相应进程ID的命令。例如,您可以使用它来查找SSH守护进程的进程ID:

代码语言:javascript
复制
$ pgrep sshd

这在功能上类似于仅将“ ps”命令的输出传递给grep。

您可以使用此信息来终止正在运行的进程或对系统上运行的服务进行故障排除。

zgrep用于搜索压缩文件中的模式。它使您可以搜索压缩存档中的文件,而不必先解压该存档,基本上可以节省一两个步骤。

代码语言:javascript
复制
$ zgrep apple fruits.txt.gz

zgrep也可用于tar文件,但似乎只能告诉您它是否能够找到匹配项。

我们之所以提及这一点,是因为用gzip压缩的文件通常是tar存档。

find和grep之间的区别

对于刚从Linux命令行开始的用户,重要的是要记住find和grep是两个具有两个截然不同功能的命令,尽管它们都用于“查找”用户指定的内容。

如本教程第一个示例所示,使用grep搜索ls命令的输出时,使用grep可以很方便。

但是,如果您需要递归搜索文件名(如果使用通配符(星号),则需要搜索文件名的一部分),那么使用'find'命令会更方便。

代码语言:javascript
复制
$ find /path/to/search -name name-of-file

上面的输出显示find命令能够成功找到我们搜索的文件。

递归搜索

可以将-r开关与grep一起使用,以递归方式搜索目录及其子目录中的所有文件,以查找指定的模式。

代码语言:javascript
复制
$ grep -r pattern /directory/to/search

如果您未指定目录,则grep只会搜索您当前的工作目录。在下面的屏幕截图中,grep找到了两个与我们的模式匹配的文件,并返回了它们的文件名和它们所在的目录。

填充空间或制表符

正如我们在前面关于如何搜索字符串的解释中提到的那样,如果文本包含空格,则可以将文本包装在引号中。选项卡也可以使用相同的方法,但是稍后我们将说明如何在grep命令中添加选项卡。

在引号内放置一个空格或多个空格,以使grep搜索该。

代码语言:javascript
复制
$ grep " " sample.txt

您可以使用grep搜索标签的方法有几种,但是大多数方法都是实验性的,或者在不同的发行版中可能不一致。

最简单的方法是仅搜索制表符本身,您可以通过在键盘上按ctrl + v,然后按Tab来产生该字符。

通常,在终端窗口中按Tab会告诉终端您要自动完成命令,但是事先按ctrl + v组合键将导致按常规方式在文本编辑器中写出Tab字符。

代码语言:javascript
复制
$ grep "    " sample.txt

熟悉Linux中的配置文件时,知道此小技巧会特别有用,因为选项卡通常用于将命令与其值分开。

使用正则表达式

通过使用正则表达式进一步扩展了Grep的功能,从而使您的搜索更加灵活。存在几种,在下面的示例中,我们将介绍一些最普通的:

[]括号用于匹配一组字符中的任何一个。

代码语言:javascript
复制
$ grep "Class [123]" Students.txt

此命令将返回任何显示“ Class 1”,“ Class2”或“ Class 3”的任何行。

带连字符的[-]括号可用于指定数字或字母字符范围。

代码语言:javascript
复制
$ grep "Class [1-3]" Students.txt

我们得到与以前相同的输出,但是该命令的键入要容易得多,尤其是当我们使用更大范围的数字或字母时。

^脱字符号用于搜索只出现在行的开头的模式。

代码语言:javascript
复制
 grep“ ^ Class” Students.txt

带方括号的脱字符号用于从搜索模式中排除字符。

代码语言:javascript
复制
$ grep "Class [^1-2]" Students.txt

$ dollar符号用于搜索只出现在行的末尾的模式。

代码语言:javascript
复制
  $ grep "1$" Students.txt

.点用于匹配任何一个字符,因此它是通配符,但仅适用于单个字符。

代码语言:javascript
复制
  $ grep "A….a" Students.txt

Grep gz文件,无需解压

如前所述,zgrep命令可用于搜索压缩文件,而无需先将其解压。

代码语言:javascript
复制
$ zgrep word-to-search /path/to/file.gz

您还可以使用zcat命令显示gz文件的内容,然后将输出到grep,以隔离包含搜索字符串的行。

代码语言:javascript
复制
$ zcat file.gz | grep word-to-search

压缩文件中的Grep电子邮件地址

我们可以使用一个奇特的正则表达式从zip文件中提取所有电子邮件地址。

代码语言:javascript
复制
  $ grep -o '[[:alnum:]+\.\_\-]*@[[:alnum:]+\.\_\-]*' emails.txt

-o标志仅提取电子邮件地址,而不显示包含电子邮件地址的整行。这样可以产生更清晰的输出。

与Linux中的大多数事情一样,有多种方法可以做到这一点。您还可以使用egrep和一组不同的表达式。但是上面的示例工作得很好,并且是提取电子邮件地址并忽略其他所有内容的非常简单的方法。

Grep IP地址

IP地址的查询可能会变得有些复杂,因为我们不仅能让grep查找由点号分隔的4个数字,可以,但是该命令也有可能返回无效的IP地址。

以下命令将仅查找和隔离有效的IPv4地址:

代码语言:javascript
复制
$ grep -E -o "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|

我们在Ubuntu服务器上使用它只是为了查看最新的SSH尝试来自何处。

为避免重复信息和使屏幕泛滥,您可能希望像上面的屏幕截图一样,将grep命令传递给“ uniq”和“ more”。

Grep or 条件

您可以通过几种不同的方式对grep使用or条件,但是我们将向您展示一种需要最少击键且最容易记住的方法:

代码语言:javascript
复制
$ grep -E 'string1|string2' filename

或者,从技术上讲,使用egrep的击键次数甚至更少:

代码语言:javascript
复制
$ egrep 'string1|string2' filename

grep或条件忽略大小写默认情况下,grep区分大小写,这意味着您必须精确搜索大写的字符串。您可以通过告诉grep忽略-i开关的情况来避免这种情况。

忽略大小写

默认情况下,grep区分大小写,这意味着您必须精确搜索大写的字符串。通过使用-i开关告诉grep忽略大小写,可以避免这种情况。

代码语言:javascript
复制
  $ grep -i string filename

搜索时区分大小写

如果我们要搜索一个字符串,其中第一个可以是大写或小写,但字符串的其余部分应该是小写怎么办?在这种情况下,无法使用-i switch 忽略大小写,所以一种简单的方法是使用方括号。

代码语言:javascript
复制
$ grep [Ss]tring filename

该命令告诉grep除首字母外,其他字母都区分大小写。

Grep精确匹配

在上面的示例中,每当我们在文档中搜索字符串“ apple”时,grep也会在输出中返回“ pineapple”。为了避免这种情况,并严格搜索“ apple”,可以使用以下命令:

代码语言:javascript
复制
$ grep "\<apple\>" fruits.txt

您还可以使用-w开关,它将告诉grep该字符串必须与整行匹配。显然,这只适用于您不希望该行的其余部分完全包含任何文本的情况下有效。

排除模式

要查看文件的内容,但要从输出中排除模式,可以使用-v开关。

代码语言:javascript
复制
$ grep -v string-to-exclude filename

如您在屏幕截图中所见,当我们使用-v开关运行相同的命令时,不再显示排除的字符串

Grep和替换

传递给sed的grep命令可用于替换文件中字符串的所有实例。此命令将在相对于当前工作目录的所有文件中将“ string1”替换为“ string2”:

代码语言:javascript
复制
$ grep -rl 'string1' ./ | xargs sed -i 's/string1/string2/g'

带行号的Grep

要显示搜索字符串所在的行数,请使用-n开关。

代码语言:javascript
复制
$ grep -n string filename

显示之前和之后的行

如果需要更多grep输出上下文,可以使用-c开关在指定的搜索字符串前后显示一行:

代码语言:javascript
复制
$ grep -c 1 string filename

指定您希望显示的行数–在此示例中,我们仅执行了1行。

对结果进行排序

将grep的输出传递给sort命令,以按某种顺序对结果进行排序。默认为字母顺序。

代码语言:javascript
复制
$ grep string filename | sort

希望这个教程对您有一定的帮助!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-12-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 SACC开源架构 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
命令行工具
腾讯云命令行工具 TCCLI 是管理腾讯云资源的统一工具。使用腾讯云命令行工具,您可以快速调用腾讯云 API 来管理您的腾讯云资源。此外,您还可以基于腾讯云的命令行工具来做自动化和脚本处理,以更多样的方式进行组合和重用。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档