使用 awk 过滤文本或文件中的字符串-LINUX

首页 2024-07-04 02:14:46

当我们在 unix/linux 当我们使用特定的命令从字符串或文件中读取或编辑文本时,我们经常需要过滤输出以获得感兴趣的部分。此时,正则表达式将派上用场。

什么是正则表达式?


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

正则表达式特征
正则表达式由以下内容组成:
  • 普通字符,例如,空格,下划线,A-Z、a-z、0-9。
  • 可扩展为普通字符,可扩展为普通字符元字符,它们包括:
    • (.) 除了换行符,它还匹配任何单个字符。
    • (*) 在它之前,它匹配了零个或多个字符。
    • [ character(s) ] 它匹配任何由字符/字符集指定的字符。您可以使用连字符(-)代表字符范围,例如 [a-f]、[1-5]等。
    • ^ 它匹配文件中一行的开头。
    • $ 它匹配文件中一行的结尾。
    • / 这是一个转义字符。

您必须使用类似的方法 awk 这种文本过滤工具过滤文本。您还可以使用它 awk 作为编程语言自己使用。但是因为这个指南的适用范围是关于使用的 awk 是的,我会根据一个简单的命令行过滤工具来介绍它。

awk 一般语法如下:
# awk 'script' filename

此处 'script' 是一个由 awk 可理解并应用于 filename 命令集合。

它通过阅读文件中的给定行来复制银行的内容,并在银行上执行脚本。此过程将在文件中的所有行中重复。

该脚本 'script' 内容的格式是 '/pattern/ action',其中 pattern 它是一种正则表达式,但是 action 是当 awk 在银行中找到该模式时应执行的动作。

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

在下面的例子中,我们将专注于之前讨论过的元字符。

一个使用 awk 简单示例:

打印文件的例子如下 /etc/hosts 由于没有指定任何模式,中间的所有行都没有。

# awk '//{print}' /etc/hosts

awk 打印文件中的所有行

结合模式使用 awk

在下面的示例中,指定了模式 localhost,因此 awk 将匹配文件 /etc/hosts 中有 localhost 的那些行。

# awk '/localhost/{print}' /etc/hosts 

awk 打印文件中匹配模式的行

在 awk 通配符用于模式 (.)

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

这里的正则表达式意味着匹配 l字符c

# awk '/l.c/{print}' /etc/hosts

使用 awk 打印文件中匹配模式的字符串

在 awk 在模式中使用字符 (*)

匹配包含在下面的例子中 localhost、localnet、lines, capable 的字符串。

# awk '/l*c/{print}' /etc/localhost

使用 awk 匹配文件中的字符串

你也可能意识到 (*) 将尝试匹配它可能检测到的最长匹配。

让我们来看看可以证明这一点的例子,正则表达式 t*t 意思是在下面的行中匹配 t 开始和 t 结束字符串:

this is tecmint, where you get the best good tutorials, how to's, guides, tecmint. 

当您使用模式时 /t*t/ 可能的结果如下:

this is t
this is tecmint
this is tecmint, where you get t
this is tecmint, where you get the best good t
this is tecmint, where you get the best good tutorials, how t
this is tecmint, where you get the best good tutorials, how tos, guides, t
this is tecmint, where you get the best good tutorials, how tos, guides, tecmint

在 /t*t/ 中的通配符 (*) 将使得 awk 最后一项选择匹配:

this is tecmint, where you get the best good tutorials, how to's, guides, tecmint
结合集合 [ character(s) ] 使用 awk

以集合 [al1] 为例,awk 将匹配文件 /etc/hosts 所有这些都包含字符 a 或 l 或 1 的字符串。

# awk /[al1]/{print}' /etc/hosts

使用 awk 打印文件中匹配的字符

匹配下一个例子 K 或 k 开始头,后面跟着一个 T 的字符串:

# awk '/[Kk]T/{print}' /etc/hosts 

使用 awk 打印文件中匹配的字符

以范围的形式指定字符

awk 可以理解的字符:

  • [0-9] 代表一个单独的数字
  • [a-z] 代表单独的小写字母
  • [A-Z] 一个单独的大写字母表示
  • [a-zA-Z] 代表单独的字母
  • [a-zA-Z 0-9] 代表单个字母或数字

让我们看看下面的例子:

# awk '/[0-9]/{print}' /etc/hosts 

使用 awk 打印文件中匹配的数字

在上面的例子中,文件 /etc/hosts 所有行至少包含一个单独的数字 [0-9]。

结合元字符 (^) 使用 awk

在下面的例子中,它匹配了以给定模式开始的所有行:

# awk '/^fe/{print}' /etc/hosts
# awk '/^ff/{print}' /etc/hosts

使用 awk 打印与模式相匹配的行

结合元字符 ($) 使用 awk

它将匹配以给定模式结束的所有行:

# awk '/ab$/{print}' /etc/hosts
# awk '/ost$/{print}' /etc/hosts
# awk '/rs$/{print}' /etc/hosts

使用 awk 与模式匹配的字符串打印

结合转义字符 (/) 使用 awk

它允许您将转义字符背后的字符作为文字,即理解为字面意思。

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

第三个命令是正确的,因为这里使用了一个转义字符来转义 $,将其识别为 $'(而非元字符)。

# awk '//{print}' deals.txt
# awk '/$25.00/{print}' deals.txt
# awk /$25.00/{print}' deals.txt

结合转义字符使用 awk

总结

以上内容不是 awk 所有的命令都用作过滤工具,上述示例都是 awk 基本操作。在下面的章节中,我将进一步介绍如何使用它 awk 高级功能。

以上就是使用 awk 请关注文本或文件中字符串的详细内容!


p