当我们在 Unix/Linux 中运行某些命令来读取或编辑字符串或文件中的文本时,我们很多时候都会查找指定特征的字符串。这可能会使用正则表达式。
正则表达式可以定义为表示多个字符序列的字符串。关于正则表达式的最重要的事情之一是它们允许你过滤命令或文件的输出、编辑文本或配置文件的一部分等等。
正则表达式由以下组成:
Ordinary characters
例如空格、下划线(_)、AZ、az、0-9
。Meta characters
扩展为普通字符,它们包括:(.)
它匹配除换行符之外的任何单个字符。(*)
它匹配它前面的直接字符的零个或多个存在。[character(s)]
它匹配字符中指定的任何一个字符,也可以使用连字符(-)
表示一系列字符,例如[a-f]
、[1-5]
等。^
它匹配文件中一行的开头。$
匹配文件中的行尾。\
它是一个转义字符。为了过滤文本,必须使用文本过滤工具,例如
awk
你可以想到awk
作为自己的编程语言。但是对于本教程的使用范围awk
,我们将把它作为一个简单的命令行过滤工具来介绍。awk 的一般语法是
# awk 'script' filename
script
可以理解的一组命令awk
并在文件,文件名上执行。它的工作原理是读取文件中的给定行,制作该行的副本,然后在该行上执行脚本。这在文件中的所有行上重复。
所述
script
的形式是/pattern/ action
其中pattern
是一个正则表达式,并且action
是 awk 在一行中找到给定模式时会做的事情。
在下面的例子中,我们将重点讨论我们在 awk 特性下讨论的元字符。
下面的示例打印
/etc/hosts
文件中的所有行,因为没有给出模式。
# awk '//{print}'/etc/hosts
我在下面的例子中,
localhost
已经给出了一个模式,所以 awk 将在/etc/hosts
文件中匹配localhost
。
# awk '/localhost/{print}' /etc/hosts
在
(.)
将匹配包含字符串loc
,localhost
,localnet
在下面的例子中。也就是说
l some_single_character c
.
# awk '/l.c/{print}' /etc/hosts
(*)
字符的 awk它将匹配包含的字符串
localhost
,localnet
,lines
,capable
,如下例所示:
# awk '/l*c/{print}' /etc/localhost
你还将意识到
(*)
尝试为你提供它可以检测到的最长匹配。让我们看一个例子来证明这一点,采用正则表达式
r*z
,这意味着匹配以字母开头r
并以z
以下行结尾的字符串:
this is rumenz, where you get the best good tutorials, how to's, guides, rumenz.
使用模式时,你将获得以下可能性
/r*z/
:
this is r
this is rumenz
this is rumenz, where you get r
this is rumenz, where you get the best good r
this is rumenz, where you get the best good tutorials, how r
this is rumenz, where you get the best good tutorials, how tos, guides, r
this is rumenz, where you get the best good tutorials, how tos, guides, rumenz
并
(*)
在/r*z/
通配符中允许 awk 选择最后一个选项:
this is rumenz, where you get the best good tutorials, how to's, guides, rumenz
以 set 为例
[al1]
,这里 awk 将匹配文件中包含字符a
或l
或1
在一行中的所有字符串/etc/hosts
.
# awk '/[al1]/{print}' /etc/hosts
下一个示例匹配以
K
或k
开头的字符串T
:
# awk '/[Kk]T/{print}' /etc/hosts
用awk理解字符:
[0-9]
表示一个数字[a-z]
表示匹配单个小写字母[A-Z]
表示匹配单个大写字母[a-zA-Z]
表示匹配单个字母[a-zA-Z 0-9]
表示匹配单个字母或数字让我们看下面的例子:
# awk '/[0-9]/{print}' /etc/hosts
文件中的所有行
/etc/hosts[0-9]
在上面的例子中至少包含一个数字。
它匹配以以下示例中提供的模式开头的所有行:
# awk '/^fe/{print}' /etc/hosts
# awk '/^ff/{print}' /etc/hosts
它匹配所有以提供的模式结尾的行:
# awk '/ab$/{print}' /etc/hosts
# awk '/ost$/{print}' /etc/hosts
# awk '/rs$/{print}' /etc/hosts
它允许你将其后的字符视为文字,也就是说按原样输出它。
在下面的示例中,第一个命令打印出文件中的所有行,第二个命令不打印任何内容,因为我想匹配具有
$25.00
,但没有使用转义字符。第三个命令是正确的,因为已使用转义字符读取
$
照原样。
# awk '//{print}' deals.txt
# awk '/$25.00/{print}' deals.txt
# awk '/\$25.00/{print}' deals.txt
相关文章