使用awk和正则表达式过滤文件中的文本或字符串

2022-06-02 15:49:01 浏览数 (1)

当我们在 Unix/Linux 中运行某些命令来读取或编辑字符串或文件中的文本时,我们很多时候都会查找指定特征的字符串。这可能会使用正则表达式。

什么是正则表达式?

正则表达式可以定义为表示多个字符序列的字符串。关于正则表达式的最重要的事情之一是它们允许你过滤命令或文件的输出、编辑文本或配置文件的一部分等等。

正则表达式的特点

正则表达式由以下组成:

  1. Ordinary characters 例如空格、下划线(_)、AZ、az、0-9
  2. Meta characters 扩展为普通字符,它们包括:
    1. (.) 它匹配除换行符之外的任何单个字符。
    2. (*) 它匹配它前面的直接字符的零个或多个存在。
    3. [character(s)]它匹配字符中指定的任何一个字符,也可以使用连字符(-)表示一系列字符,例如[a-f][1-5]等。
    4. ^ 它匹配文件中一行的开头。
    5. $ 匹配文件中的行尾。
    6. 它是一个转义字符。

为了过滤文本,必须使用文本过滤工具,例如 awk 你可以想到awk作为自己的编程语言。但是对于本教程的使用范围awk,我们将把它作为一个简单的命令行过滤工具来介绍。

awk 的一般语法是

代码语言:javascript复制
# awk 'script' filename

script可以理解的一组命令awk 并在文件,文件名上执行。

它的工作原理是读取文件中的给定行,制作该行的副本,然后在该行上执行脚本。这在文件中的所有行上重复。

所述script的形式是/pattern/ action其中pattern 是一个正则表达式,并且 action 是 awk 在一行中找到给定模式时会做的事情。

如何在 Linux 中使用 awk 过滤工具

在下面的例子中,我们将重点讨论我们在 awk 特性下讨论的元字符。

使用 awk 的一个简单示例:

下面的示例打印/etc/hosts文件中的所有行,因为没有给出模式。

代码语言:javascript复制
# awk '//{print}'/etc/hosts
将 awk 与模式一起使用:

我在下面的例子中,localhost已经给出了一个模式,所以 awk 将在/etc/hosts文件中匹配localhost

代码语言:javascript复制
# awk '/localhost/{print}' /etc/hosts
在模式中使用带有 (.) 通配符的 awk

(.)将匹配包含字符串loc, localhost, localnet 在下面的例子中。

也就是说 l some_single_character c.

代码语言:javascript复制
# awk '/l.c/{print}' /etc/hosts
在模式中使用带有 (*) 字符的 awk

它将匹配包含的字符串 localhost, localnet, lines, capable,如下例所示:

代码语言:javascript复制
# awk '/l*c/{print}' /etc/localhost

你还将意识到(*)尝试为你提供它可以检测到的最长匹配。

让我们看一个例子来证明这一点,采用正则表达式r*z,这意味着匹配以字母开头r并以z以下行结尾的字符串:

代码语言:javascript复制
this is rumenz, where you get the best good tutorials, how to's, guides, rumenz.

使用模式时,你将获得以下可能性/r*z/

代码语言:javascript复制
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 选择最后一个选项:

代码语言:javascript复制
this is rumenz, where you get the best good tutorials, how to's, guides, rumenz
将 Awk 与 set [ character(s) ] 一起使用

以 set 为例[al1],这里 awk 将匹配文件中包含字符al1在一行中的所有字符串/etc/hosts.

代码语言:javascript复制
# awk '/[al1]/{print}' /etc/hosts

下一个示例匹配以Kk开头的字符串T

代码语言:javascript复制
# awk '/[Kk]T/{print}' /etc/hosts
指定范围内的字符

用awk理解字符:

  1. [0-9] 表示一个数字
  2. [a-z] 表示匹配单个小写字母
  3. [A-Z] 表示匹配单个大写字母
  4. [a-zA-Z] 表示匹配单个字母
  5. [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

它允许你将其后的字符视为文字,也就是说按原样输出它。

在下面的示例中,第一个命令打印出文件中的所有行,第二个命令不打印任何内容,因为我想匹配具有 $25.00,但没有使用转义字符。

第三个命令是正确的,因为已使用转义字符读取 $ 照原样。

代码语言:javascript复制
# awk '//{print}' deals.txt
# awk '/$25.00/{print}' deals.txt
# awk '/$25.00/{print}' deals.txt

相关文章

Shell三大利器之awk

linux之awk使用技巧

0 人点赞