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

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

作者: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使用简单介绍

时间: 2024-10-10 13:35:50

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

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

当我们在 Unix/Linux 下使用特定的命令从字符串或文件中读取或编辑文本时,我们经常需要过滤输出以得到感兴趣的部分.这时正则表达式就派上用场了. 什么是正则表达式? 正则表达式可以定义为代表若干个字符序列的字符串.它最重要的功能之一就是它允许你过滤一条命令或一个文件的输出.编辑文本或配置文件的一部分等等. 正则表达式的特点 正则表达式由以下内容组合而成: 普通字符,例如空格.下划线.A-Z.a-z.0-9. 可以扩展为普通字符的元字符,它们包括: (.) 它匹配除了换行符外的任何单个字符.

awk命令之 - 统计/etc/passwd文件中各用户所使用的shell类型及出现次数

统计/etc/passwd文件中各用户所使用的shell类型及出现次数 awk -F: 'BEGIN{printf"%-15s\t%s\n","ShellType","Count"}{shellType[$NF]++}END{for(i in shellType)printf"%-15s\t%d\n",i,shellType[i]}' /etc/passwd

使用正则表达式过滤文本

regex用法: . 匹配除换行符以外的任意文本 \w 匹配字母或数字或下划线或汉子 反义符-(^\w) \s 匹配任意的空白符(空格,TAB\t,回车\r,制表符\n) 反义符-(^\s) \d 匹配数字[0-9]反义符-[^0-9] ^ 匹配字符串的开始 $ 匹配字符串的结束 \b 匹配单词的开始 *重复0次或多次 +重复1次或多次 ?重复0次或1次 (?<=)正向肯定预查 (?=)反向否定预查 1.制定regex 2.获取NSRegularExpression 3.获取NSRange,fi

基本正则表达式和文本处理工具之grep、egrep和fgrep

Grep(global search regular expression and print out the line全局搜索正则表达式并把行打印出来),是一种强大的文本搜索工具,egrep和fgrep的命令跟grep只有很少的差别,linux使用的是GNU版本的grep,功能非常强大,可以通过-G,-E,-F命令选项来使用egrep和fgrep的功能,grep的工作方式为在一个或多个文件中搜索字符串模板,如果模板包括空格则必须被引用,模板后的所有字符串被看做文件名,搜索的结果被送到屏幕,不影

Linux命令(八)过滤文本 grep

grep 命令介绍 grep是一个强大的文本搜索工具命令,用于查找文件中符合指定格式的字符串,支持正则表达式.如不指定任何文件名称,或是文件名为 -,则gerp命令从标准输入设备中读取数据. grep 家族包括grep egrep 和 fgrep. egrep 和 fgrep 命令只跟 grep 有很小的不同. egrep 是 grep 的扩展 , fgrep 就是 fixed grep 或 fast grep,该命令使用任何正则表达式中的元字符表示其自身的字面意义,不在特殊.其中 egrep

正则表达式和文本处理工具

一 什么是正则 正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法.或者说:正则就是用来描述一类事物的规则. 生活中处处都是正则:     比如我们描述:4条腿      你可能会想到的是四条腿的动物或者桌子,椅子等     继续描述:4条腿,活的           就只剩下四条腿的动物这一类了 在linux中,通配符是由shell解释的,而正则表达式则是由命令解释的,下面我们就为大家介绍三种文本处理工具/命令:grep.sed.awk,它们三者均可以解释正

Shell第二篇:正则表达式和文本处理工具

一 什么是正则 正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法.或者说:正则就是用来描述一类事物的规则. 生活中处处都是正则:     比如我们描述:4条腿      你可能会想到的是四条腿的动物或者桌子,椅子等     继续描述:4条腿,活的           就只剩下四条腿的动物这一类了 在linux中,通配符是由shell解释的,而正则表达式则是由命令解释的,下面我们就为大家介绍三种文本处理工具/命令:grep.sed.awk,它们三者均可以解释正

linux(5)--补充(管道| / 重定向&gt; / xargs)/find 与xargs结合使用/vi,grep,sed,awk(支持正则表达式的工具程序)

本节中正则表达式的工具程序 grep,sed和awk是重点,也是难点!!! 先补充一下一. 管道| / 重定向> / xargs 如:1. 管道和重定向的区别:具体可以见 http://www.cnblogs.com/chengmo/archive/2010/10/21/1856577.html以此为例: cat test.sh test1.sh 2>/dev/null | grep -n 'echo' 此时若test.sh 不存在,报错信息不会输出到屏幕中,而是转入 /dev/null中,如

使用正则表达式配合文本搜索工具Grep以及Egrep快速搜索文本

正则表达式: 计算机科学的一个概念.正则表达式使用单个字符串来描述.匹配一系列符合某个句法规则的字符串.在很多文本编辑器里,正则表达式通常被用来检索.替换那些符合某个模式的文本. 正则表达式由两类组成: 基本正则表达式与扩展正则表达式 基本正则表达式: 字符匹配 .:匹配单个字符 []:匹配指定集合中的任意单个字符 [:digit:]:所有数字(0-9) [:lower:]:所有小写字母(a-z) [:upper:]:所有大写字母(A-Z) [:space:]:空白符 [:punct:]:特殊字