吉游网提供最新游戏下载和手游攻略!

转发至今日头条grep正则表达式引号

发布时间:2024-07-18浏览:3

假设你有一个文件(或者一堆文件),你想在这些文件中搜索特定的字符串或者配置关键字。在 Windows 中,你可能打开这些文件,用搜索框(CTRL+F)输入关键字进行搜索,很麻烦,不能随心所欲地搜索。在 Linux 中就不一样了,我们可以使用 Grep,它可以使用正则表达式随心所欲地搜索,不只是针对一个文件,还可以针对一堆文件。搜索的入口和出口可以连接到管道,用于搜索其他工具的结构,或者将搜索结果传递给其他工具。

今天我们来聊聊 Linux Shell 下文本处理三剑客之一的 Grep,了解它的用法最简单的方法就是使用系统帮助和 man:

man page比较详细,来源于其帮助手册,在Linux(例如CentOS)中查询内置命令帮助手册的方法是使用rpm -qd grep

-q 表示查询;-d 表示列出其文档:

rpm -qd grep

grep 基础知识

开始之前我们以centos自带的字典文件为例,文件位于/usr/share/dict/words

wc /usr/share/dict/words

479829 479829 4953699 /usr/share/dict/words

该文件包含 480,000 个单词,每行一个单词,由 centos 的 word 包提供。grep 还有一个 -c (--count) 选项,用于统计与搜索匹配的行数。我们先用它来统计它的单词树。

grep --count ‘.’ /usr/share/dict/words

479829

这与 wc 的结果相同。

在搜索中,我们指定了模式为“。”,这意味着搜索包含至少一个字符、空格、空格、制表符等的行。

Grep 正则表达式基础

grep 最重要的两个优点是:一是搜索速度非常快,二是支持正则表达式(RE,regexes)。正则表达式使得 grep 的功能更加强大。所以首先我们需要介绍一下正则表达式的基础知识。

开始

假设我们要搜索以 C 开头的单词,我们需要使用正则模式起始模式:(^) 加起始字符。例如:

结尾

要搜索以特定字符结尾的模式,请使用美元符号 ($) 来指示字符串的结尾。例如,要搜索以 sth 结尾的单词

grep 'sth#39; /usr/share/dict/words

其他 RE 模式

正则表达式语法非常复杂,不同系统可能略有不同,请参考相应文档了解详情。grep 中其他常用的语法包括:

. 代表单个字符

* 表示前一个字符出现 0 次或多次,例如 .* 表示任意字符。

+ 表示前一个字符出现 1 次或多次。请注意,这仅在增强型 egrep 或 grep -E 中可用。在基本 grep 中,使用 \+

? 表示前一个字符出现 0 次或 1 次。在基本 grep 中,需要使用 \?

{} 表示前一个字符出现的次数,例如:{n} n 次,{n,m} n 到 m 次,{n,} 至少 n 次,{0,m} 至多 m 次。在 grep 中,使用 \{n\}

[az][0-9]代表a~z,0~9的范围。

[^] 否定,表示匹配除范围之外的模式。

\, \b:单词结束。

() 表示分组。在基本 grep 中,使用 \(\)。

| 表示逻辑或,匹配多个表达式中的任意一个。在基本 grep 中,\|

grep正则表达式_正则表达式grep_grep正则表达式引号

清除注释(-v)

刚才我们对 grep 有了初步的了解,现在我们通过一些例子来说明 grep 的具体应用。我们知道 Linux 中很多配置文件都包含大量的注释(以 # 开头的行),注释非常详细,但是我们通常并不想详细去了解它们,所以在浏览的时候希望去掉它们。我们以 ntp.conf 为例:

猫/etc/ntp.conf

grep 的 -v 选项表示排除模式,也就是显示所有不匹配的内容。例如,要删除 ntp.conf 中的注释,我们使用:

grep -v '^#' /etc/ntp.conf

上面的注释行全部用空行隔开,虽然这样显示起来比较清晰,但是看上去有点别扭,不是吗?

那么我们可以想办法把空行去掉,方法很简单:用管道连接到另一个grep,然后把空行去掉($)

grep -v '^#' /etc/ntp.conf |grep -v '^#39;

好的,这更令人耳目一新。

仅输出 /et/passwd 用户名 (-o)

为了展示 grep 的强大功能和正则表达式的用法,我们需要解析 /etc/passwd 文件并仅打印用户名。

猫/etc/passwd

该文件各行字段具体含义:

::::::

要仅输出用户名,可以使用以下查询

grep -o '^[a-zA-Z_-]\+' /etc/passwd

在上面的 grep 命令中,我们使用了 grep -o (--only-matching) 选项,这意味着只显示匹配的

那部分线。

显示相邻线(-C、-A、-B)

我们在查看日志的时候,有时候不能只看匹配的行,还需要上下文信息。grep 也提供了这样的功能,显示匹配行之前或者之后的行。这在排查问题的过程中非常有用,再也不需要打开文章,定位,再看上下文了。

-C n 表示打印匹配的行以及其前后 n 行。此处可以省略 -C,而使用 -n

-A n 表示打印匹配的行和其后的n行信息。

-B n 表示打印匹配的行及前n行的信息。

例如,我们在tomcat catalina.out日志中搜索严重错误,可以使用:

grep ‘严重:错误’ catalina.out

由于缺乏上下文,无法获得具体信息。此时可以使用-C

grep -20 ‘严重:错误’ catalina.out

这样就可以获取错误信息来定位错误:

搜索二进制文件(-a)

grep 是文本三剑客之一,但是作为文本三剑客并不代表它只能处理文本文件,其实它也可以处理二进制文件,这就是 grep 的 -a (--binary-files=text) 选项,可以搜索并显示二进制文本。这个在安全领域非常有用,比如有时候需要判断某些文件是否有害,是否有木马,可以简单用 grep 搜索它们的特征。我们举个例子,对于一个 java 类文件 x.class,我们使用 javap 来解析这个类文件

javap x.class

热点资讯