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