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

时间:2021-10-16 10:06:11
当我们在 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 打印文件中的所有行

结合模式使用 awk

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

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


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

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

在 awk 模式中使用通配符 (.)

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

这里的正则表达式的意思是匹配  l一个字符c

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


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

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

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

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

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


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

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

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

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

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

当你使用模式
/t*t/
时,会得到如下可能的结果:

this is tthis 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 和正则表达式过滤文本或文件中的字符串

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

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

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


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

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

以范围的方式指定字符

awk 所能理解的字符:

[0-9]
代表一个单独的数字

[a-z]
代表一个单独的小写字母

[A-Z]
代表一个单独的大写字母

[a-zA-Z]
代表一个单独的字母

[a-zA-Z 0-9]
代表一个单独的字母或数字

让我们看看下面的例子:

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


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

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

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

结合元字符 (^) 使用 awk

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

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


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

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

结合元字符 ($) 使用 awk

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

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


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

使用 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 的高级功能。感谢您的阅读,请在评论区贴出您的评论。

作者: Aaron Kili  译者: wwy-hust  校对: wxy  

参考来源: 
awk 系列:如何使用 awk 和正则表达式过滤文本或文件中的字符串
http://www.lai18.com/content/24604054.html

延伸阅读

《Linux常用命令手册》系列技术文章整理收藏 
Linux常用命令手册整理收藏常用的Linux命令,帮助自己,也帮助大家更好地掌握这些常用Linux命令,给Linux操作带来便利,更好地使用Linux系统

1awk 系列:如何使用 awk 和正则表达式过滤文本或文件中的字符串

2Linux常用命令-awk 手册

3Linux 新手必知必会的 10 条 Linux 基本命令

4Linux/UNIX 定时任务 cron 详解

5在 Linux 下使用 scp 命令

6Linux中文件的压缩与解压缩命令操作示例集锦

7Linux中文本处理命令sed的使用示例分享

8Linux中使用grep命令搜索文件名及文件内容的方法

9全面解析Linux的grep命令中正则表达式的用法

10grep 命令系列:如何在 UNIX 中根据文件内容查找文件

11grep 命令系列:从文件中搜索并显示文件名

12在Linux命令终端中查看和编辑曾执行过的命令

13讲解Linux中校验文件的MD5码与SHA1码的命令使用

14grep 命令系列:用 grep 命令统计匹配字符串的行数

15grep 命令系列:使用 grep 命令来搜索多个单词

16grep 命令系列:grep 中的正则表达式

17详解Linux系统中查询文档的man和info命令

18Linux系统中安装使用Bzip2来压缩文件的方法讲解

19Linux下用gzip和unzip命令来压缩和解压文件的用法

20Linux中的文件压缩命令tar与rar的用法总结

21Linux中控制文件权限修改的chgrp和umask命令用法

22举例讲解Linux下grep命令的精彩使用技巧

23详解Linux系统中su和sudo命令的用法

24Linux 系统下查看硬件信息命令大全

25grep 命令系列:如何在 Linux/UNIX 中使用 grep 命令

26在Linux系统中使用who和whoami命令获取用户信息

27简单掌握Linux中用于更改访问控制的chacl命令

28详解Linux系统中管理文件权限的chown和chmod命令

29Linux系统中修改与查看文件属性的基本方法

30Linux中的mail邮件命令的各种参数使用详解

31详解Linux中的用户密码管理命令passwd和change

32Linux系统中dig命令用法完全罗列

33Linux中DNS服务器地址查询命令nslookup使用教程

34详解Linux中用于查询用户信息的finger和chfn命令

35Linux系统中SSH命令的使用教程

36详解Linux下常用远程登陆命令telnet和rlogin的用法

37Linux系统中nc命令的基本用法掌握

38Linux中获取网络信息的netstat命令的常用参数和用法

39linux命令之top该怎么用?top命令详解

40linux下用shell、sed批量替换多个文件中的字符串

41linux中scp命令和scp命令用法大全

42Linux 经常使用的命令

43新手应知应会的Linux命令

44积累linux常用的命令

45详解Linux系统中md5sum命令的用法

46Linux中,创建聊天服务器、移除冗余软件包的实用命令

47Linux中7个用来浏览网页和下载文件的命令

48在Linux系统中使用tar命令压缩和解压文件的教程

4912个linux进程管理命令介绍

50Linux Ctrl+Z的使用方法

515个经典有趣的 Linux 命令行技巧

52Centos下查看网卡的实时流量命令

53linux、unix下快速清空文件的方法

5411个让你吃惊的 Linux 终端命令

5514 个 Linux grep 命令的例子

56Linux 中 sort 命令的14个有用的范例(一)

57Apache、PHP 隐藏版本信息

58解决ssh登录后闲置时间过长而断开连接

59centos 用户相关的命令

60grep如何忽略过滤.svn目录以及如何忽略多个目录

61centos 用户相关的命令

62解决ssh登录后闲置时间过长而断开连接

63Shell脚本统计文件行数的8种方法

64Linux xargs命令

65Linux文本搜索工具grep使用详解

66linux系统用什么命令查看端口的占用情况?

67Linux如何提高大文件的拷贝效率以节约时间

68Linux查看系统日志的一些常用命令总结

69Ubuntu文本编辑器vi使用方向键出错的解决方法

704个最流行的Linux平台开源代码编辑器

7120条Linux命令面试问答

72在 Linux 下你所不知道的 df 命令的那些功能

73Linux ps 命令实战

74Linux系统中下载文件的wget命令操作实例

75Linux正则表达式使用指南

76CentOS 6.5系统设置固定IP的方法

77Linux如何使用awk文本处理工具进行数组排序

78Linux tar命令Tar Time Stamp in the Future问题解决方法

79CentOS如何将DVD设置为默认yum源以便DVD中软件的下载安装

80Linux下查看内存使用情况的方法总结

81Linux如何使用locate命令查找数据查找指定文件

82Linux find命令中-path -prune参数作用详细介绍

83Linux curl使用简单介绍