grep对文件内容搜索(附重要拓展-正则表达式)

文件搜索是搜索查找符合条件的某文件的目录,若要编辑文件或对文件的某配置进行修改,就需要对文件内容进行搜索。

grep 命令是 Linux 及类 Unix 操作系统中的一个强大的文本搜索工具,用于搜索一个或多个文件中匹配给定模式的行。grep 代表"Global Regular Expression Print",意味着它使用正则表达式作为搜索模式,并且能够全局地在文件中查找匹配的文本。

拓展:正则表达式

正则表达式(Regular Expression,通常缩写为 regex、regexp 或 RE)是一种用于文本模式匹配的强大工具。它使用特定的字符序列来描述、匹配和操作字符串,可以用于搜索、替换、提取或验证文本数据中符合特定模式的字符串。普通字符表示它们自身,而特殊字符则具有特定的含义,用来表示字符类、数量限定符、位置或序列查找等功能。

正则表达式的核心在于其元字符(Metacharacter),这些字符具有特殊的含义,能够代表更广泛的字符集或模式。以下是一些常见的元字符:

  • `.`:匹配任何单个字符(除了换行符)。
  • `^`:表示行的开始。
  • `$`:表示行的结束。
  • `*`:匹配前一个字符零次或多次。
  • `+`:匹配前一个字符一次或多次。
  • `?`:匹配前一个字符零次或一次。
  • `{m,n}`:匹配前一个字符至少 m 次,至多 n 次。
  • ` `:字符集,匹配括号内的任何一个字符。
  • `|`:表示"或",匹配左边或右边的表达式。
  • `()`:用于分组,改变优先级或捕获匹配的部分。

正则表达式还支持更多高级特性,如非捕获组、前瞻断言、后瞻断言等,这使得它能够处理更为复杂的匹配逻辑。

正则表达式在各种编程语言和工具中都有应用,如 Perl、Python、JavaScript、Java、.NET、Unix shell 工具(如 sed 和 grep)等。它们被广泛用于数据清洗、文本解析、表单验证、日志分析等各种场景中。

例如,下面是一个简单的正则表达式示例,用于匹配邮箱地址:

bash 复制代码
[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}

在这个表达式中:

  1. a-zA-Z0-9._%+-+:
  • 这个部分匹配用户名。方括号 ` ` 定义了一个字符集,其中包含的字符都可以匹配。
  • `a-z` 和 `A-Z` 匹配任何小写字母或大写字母。
  • `0-9` 匹配任何数字。
  • `._%+-` 匹配下划线、点号、百分号、加号和减号。
  • `+` 在这里表示前面的字符集可以重复一次或多次。
  1. @:
  • 直接匹配 @ 符号,这是电子邮件地址中用户名和域名之间的分隔符。
  1. a-zA-Z0-9.-+:
  • 同样使用了字符集来匹配域名部分,与用户名部分相似,但是不包括 `%+-`,因为这些字符在域名中通常不会出现。
  • 再次,`+` 表示这个字符集中的任意字符可以重复一次或多次。
  1. \.:
  • 点号(`.`)在正则表达式中有特殊含义,所以要匹配实际的点号,++需要使用反斜杠(`\`)来转义它。++
  1. a-zA-Z{2,}:
  • 最后一部分用于匹配顶级域名,如 ".com"、".org" 等。
  • a-zA-Z表示任何字母。
  • {2,} 表示这部分至少有2个字母,但实际上没有上限,尽管大多数顶级域名不会超过3或4个字母。

将这些部分组合起来,整个正则表达式可以匹配大多数常见的电子邮件地址格式,例如:

·`joha.den@example.com`

·`info@company.co.uk`


grep的基本语法:

bash 复制代码
grep [options] pattern [file]
  • pattern 是你想要搜索的文本或正则表达式。
  • file 是你要在其中搜索的文件名。如果没有指定文件,grep 会从标准输入中读取数据。

常用选项

  • -i:忽略大小写。
  • -v:反向搜索,即显示不匹配的行。
  • -c:只显示匹配的行数,而不是显示行的内容。
  • -n:显示匹配的行号。
  • -r-R:递归搜索,即搜索指定目录下的所有文件。

注意事项

  • 使用正则表达式时,某些特殊字符需要被转义,例如点号(.)、星号(*)等。
  • 如果 pattern 包含空格,需要用引号包裹起来。
  • grep 支持多种模式,包括固定字符串、正则表达式等。

应用:

1.抓取已知文档的关键字

如上图,grep对某文件的关键字进行抓取,输出的是带有该关键字的行内容,所有包含该关键字的行都会被抓取出来。

2.单纯的知道行的内容不便于我们修改,如果我们想知道该元素在哪行该怎么办?

如上,即加入-n 即第137行。

验证(用前面学过的cat可以验证一下该元素在哪一行)

即cat -n H.txt

3.除此之外,还有一个选项是反向搜索-v,即不包括后面关键字的行。

这种搜索有什么用呢?

其中etc路径下存储配置文件,前面加的#代表注释,解释说明的作用,初期对文件不了解时可以借助注释简要了解,但是后期在对服务器运维的过程中,注释过多可能会导致占用内存过多,会影响我们修改文件,所以后期会去掉注释,这时我们就可以利用grep -v '#' /etc/services

其中注释分为以#开头的注释和中间有#的注释两部分,如下图。

上个命令会把所有带#的行都抓取出来,若只想把以#开头的注释提取出来,需要在'#'前加一个^

与之对应,符号表示以某关键字结尾,其中该关键字要放在前面,比如下图以s结尾

上文我们想去掉注释,但是上面的方法把#不在句首的行也去掉了,也就是说,有一部分的有用信息被去掉了。所以要去掉的是以#开头的行,

  1. 之前说过,Linux系统是严格区分大小写的,如果不想区分大小写,需要加入选项-i,如
bash 复制代码
grep -i abc H.txt

5.组合使用,搜索当前目录及其子目录中所有 .txt 文件里包含 "s" 的行:

相关推荐
A小辣椒2 天前
TShark:Wireshark CLI 功能
linux
A小辣椒2 天前
TShark:基础知识
linux
AlfredZhao2 天前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci
AlfredZhao3 天前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户9718356334663 天前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪3 天前
linux 拷贝文件或目录到指定的位置
linux
摇滚侠4 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
bush44 天前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行5204 天前
Linux 11 动态监控指令top
linux
不会C语言的男孩4 天前
Linux 系统编程 · 第 8 章:进程基础
linux·c语言