专栏首页CU技术社区是真的很详细了!Linux中的Grep命令使用实例

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

在本教程中,您将学习如何在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文件夹。

$ ls | grep Documents

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

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

查找字符串

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

$ ls | grep 'My Documents'

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

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

$ grep 'Class 1' Students.txt

查找多个字符串

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

$ grep -e 'Class 1' -e Todd Students.txt

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

grep egrep fgrep pgrep zgrep之间的区别

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

在grep的手册页中:

$ egrep is the equivalent of grep -E

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

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

  $ egrep p\{2} fruits.txt

要么

$ grep -E p\{2} fruits.txt

$ fgrep is the equivalent of grep -F

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

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

$ pgrep sshd

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

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

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

$ zgrep apple fruits.txt.gz

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

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

find和grep之间的区别

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

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

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

$ find /path/to/search -name name-of-file

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

递归搜索

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

$ grep -r pattern /directory/to/search

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

填充空间或制表符

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

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

$ grep " " sample.txt

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

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

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

$ grep "    " sample.txt

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

使用正则表达式

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

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

$ grep "Class [123]" Students.txt

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

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

$ grep "Class [1-3]" Students.txt

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

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

 grep“ ^ Class” Students.txt

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

$ grep "Class [^1-2]" Students.txt

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

  $ grep "1$" Students.txt

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

  $ grep "A….a" Students.txt

Grep gz文件,无需解压

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

$ zgrep word-to-search /path/to/file.gz

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

$ zcat file.gz | grep word-to-search

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

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

  $ grep -o '[[:alnum:]+\.\_\-]*@[[:alnum:]+\.\_\-]*' emails.txt

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

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

Grep IP地址

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

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

$ 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条件,但是我们将向您展示一种需要最少击键且最容易记住的方法:

$ grep -E 'string1|string2' filename

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

$ egrep 'string1|string2' filename

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

忽略大小写

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

  $ grep -i string filename

搜索时区分大小写

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

$ grep [Ss]tring filename

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

Grep精确匹配

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

$ grep "\<apple\>" fruits.txt

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

排除模式

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

$ grep -v string-to-exclude filename

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

Grep和替换

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

$ grep -rl 'string1' ./ | xargs sed -i 's/string1/string2/g'

带行号的Grep

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

$ grep -n string filename

显示之前和之后的行

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

$ grep -c 1 string filename

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

对结果进行排序

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

$ grep string filename | sort

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

本文分享自微信公众号 - CU技术社区(ChinaUnix2013),作者:栈栈

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-12-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • ​如何在Linux中使用grep命令?

    在本文中,我们将讨论一个linux命令,该命令在Linux中进行搜索非常有用。那就是“ grep”命令。我们可以使用grep搜索文件中的文本模式,另一方面,可以...

    用户6543014
  • 收到一篇世界杯投稿,打开一看竟然是…

    2018 俄罗斯世界杯正在激战,每个球队都有自己的特点,每场比赛也都有不同的看点,能进世界杯的 32 支队伍都不弱,但有些比赛看的是着实让人着急。

    用户6543014
  • 大数据场景下,如何快速将Linux 大文件处理小

    工作中使用MapReduce任务导出一批含有路径的文件,共计行数300W+,需要检测文件是否在对应的服务器中存在,而文件所在的服务器并非hadoop集群的服务器...

    用户6543014
  • Linux - 常用命令:grep

    参数 -c 只输出匹配行的个数。 -i 不区分大小写(只适用于单字符)。 -h 查询多文件时不显示文件名。 -l 查询多文件时只输出包含匹配字符的文件名。 -n...

    以谁为师
  • 【Go 语言社区】linux 下Go服务器部署(也同样适合C++等)

    作为服务器开发人员,GO语言内网测试数据及调试肯定很简单,如果你在Windows下开发 直接编成EXE执行就可以,然后部署外网在打包成linux的执行文件(交...

    李海彬
  • linux服务器被植入ddgs、qW3xT.2挖矿病毒的处理实战记录

    随着虚拟货币的疯狂炒作,挖矿病毒已经成为不法分子利用最为频繁的攻击方式之一。病毒传播者可以利用个人电脑或服务器进行挖矿,具体现象为电脑CPU占用率高,C盘可使用...

    砸漏
  • 常用Linux命令整理

    1、匹配文本内容,常用grep -E '查找的内容' 文件名。更多用法参考:https://www.cnblogs.com/leo-li-3046/p/5690...

    用户5325874
  • Linux常用命令03 - grep

    grep 命令代表“全局正则表达式 print” ,它是 Linux 中最强大和最常用的命令之一。

    叉叉敌
  • 使用正则匹配并显示匹配的内容

    最近在解析HTML文件,遇到这样的一个场景。我需要将HTML文件中data-url="xxx"中的xxx查找并显示出来。

    大江小浪
  • linux命令-grep

    咻一咻

扫码关注云+社区

领取腾讯云代金券