如何使用 awk 按模式筛选文本或字符串

在筛选文本时,有时你可能想根据某个给定的条件或使用一个可被匹配的特定模式,去标记某个文件或数行字符串中的某几行。使用 awk 来完成这个任务是非常容易的,这也正是 awk 中可能对你有所帮助的几个功能之一。


让我们看一看下面这个例子,比方说你有一个写有你想要购买的食物的购物清单,其名称为 food_prices.list,它所含有的食物名称及相应的价格如下所示:

$ cat food_prices.list
No  Item_Name       Quantity    Price
1   Mangoes            10       $2.45
2   Apples             20       $1.50
3   Bananas            5        $0.90
4   Pineapples         10       $3.46
5   Oranges            10       $0.78
6   Tomatoes           5        $0.55
7   Onions             5        $0.45

然后,你想使用一个 (*) 符号去标记那些单价大于 $2 的食物,那么你可以通过运行下面的命令来达到此目的:

$ awk ‘/ */$[2-9]/.[0-9][0-9] */ { print $1, $2, $3, $4, "*" ; } / */$[0-1]/.[0-9][0-9] */ { print ; }‘ food_prices.list

打印出单价大于 $2 的项目

从上面的输出你可以看到在含有芒果(和菠萝的那行末尾都已经有了一个 (*) 标记。假如你检查它们的单价,你可以看到它们的单价的确超过了 $2 。

在这个例子中,我们已经使用了两个模式:
第一个模式: / */$[2-9]/.[0-9][0-9] */ 将会得到那些含有食物单价大于 $2 的行。
第二个模式: /*/$[0-1]/.[0-9][0-9] */ 将查找那些食物单价小于 $2 的那些行。

上面的命令具体做了什么呢?这个文件有四个字段,当模式一匹配到含有食物单价大于 $2 的行时,它便会输出所有的四个字段并在该行末尾加上一个 (*) 符号来作为标记。

第二个模式只是简单地输出其他含有食物单价小于 $2 的行,按照它们出现在输入文件 food_prices.list 中的样子。

这样你就可以使用模式来筛选出那些价格超过 $2 的食物项目,尽管上面的输出还有些问题,带有 (*) 符号的那些行并没有像其他行那样被格式化输出,这使得输出显得不够清晰。

我们在 awk 系列的第二部分中也看到了同样的问题,但我们可以使用下面的两种方式来解决:

1、可以像下面这样使用 printf 命令,但这样使用又长又无聊:

$ awk ‘/ */$[2-9]/.[0-9][0-9] */ { printf "%-10s %-10s %-10s %-10s/n", $1, $2, $3, $4 "*" ; } / */$[0-1]/.[0-9][0-9] */ { printf "%-10s %-10s %-10s %-10s/n", $1, $2, $3, $4; }‘ food_prices.list

使用 Awk 和 Printf 来筛选和输出项目

2、 使用 $0 字段。Awk 使用变量 0 来存储整个输入行。对于上面的问题,这种方式非常方便,并且它还简单、快速:

$ awk ‘/ */$[2-9]/.[0-9][0-9] */ { print $0 "*" ; } / */$[0-1]/.[0-9][0-9] */ { print ; }‘ food_prices.list

使用 Awk 和变量来筛选和输出项目

结论

这就是全部内容了,使用 awk 命令你便可以通过几种简单的方法去利用模式匹配来筛选文本,帮助你在一个文件中对文本或字符串的某些行做标记。

本文转载地址:http://www.linuxprobe.com/awk-filt-string.html

免费提供最新Linux技术教程书籍,为开源技术爱好者努力做得更多更好:http://www.linuxprobe.com/

时间: 2024-11-03 01:55:51

如何使用 awk 按模式筛选文本或字符串的相关文章

一个电影的时间掌握Awk(Linux)文本处理脚本语言

可以查看我用CmdMarkDown写的在线版,会比下面看起来舒服:在线分享版 Awk Awk.sed与grep,俗称Linux下的三剑客,它们之前有很多相似点,但是同样也各有各的特色,相似的地方是它们都可以匹配文本,其中sed和awk还可以用于文本编辑,而grep则不具备这个功用.sed是一种非交互式且面向字符流的编辑器(a "non-interactive" stream-oriented editor),而awk则是一门模式匹配的编程语言,因为它的主要功能是用于匹配文本并处理,同时

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

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

awk(2)-模式(pattern)

在上文 awk(1)-简述我们将简要描述了awk的主要使用方向和构成(由一个或多个模式-动作组成),本小节主要讲述awk的各种模式. ps:例子中使用的输入文件(如countries)内容可由awk(1)-简述获取 1.模式是什么 ls -l | awk 'NR > 1 && $5 > 1024 {print $9}' //打印当前目录下面,大小大于1K(1024)的文件或目录名称 加粗字体部分即为模式,由此可见模式的主要作用是用于匹配. 2.有多少种模式 在awk progr

IE的浏览器模式、文本模式

最近在部署网页的时候,发现IE下的布局完成混乱. 在改变IE的文本模式后,显示就正常了. IE的浏览器模式,用于切换IE针对该网页的默认文本模式.对不同版本浏览器的条件注释解析.决定请求头里userAgent的值.它在浏览器发出请求之前就已经确定,网站没有办法修改这个值.它代表的是用户以何种浏览器访问网站. 主要的是文本模式,文本模式决定浏览器的排版引擎和JS引擎,它代表的是浏览器以何种模式呈现页面. 为了解决布局混乱的问题,我们需要手动决定文本模式,通常我们采用以下的语句: <meta htt

awk的模式和动作

awk的模式和动作 [语法结构] awk -F 'Pattern1{Action1};Pattern2{Action2}' input-file或 awk -F '{Action}' input-file ① -F 为字段分隔符.若不指定,默认会使用空格作为分隔符. ② /Pattern/和{Action}需要用单引号引起来,防止shell作解释. ③ /Pattern/是可选的.如果不指定,awk 将处理输入文件中的所有记录.如果指定一个模式,awk 则只处理匹配指定的模式的记录. ④ {Ac

IE (第二部分) 浏览器 中 关于浏览器模式和文本模式

判断真正的 IE 版本 很多 JS 框架都通过 UA 判断 IE 的版本.对于 IE6,这种做法没问题( IE6 没有浏览器模式的概念,也没有其它 IE 可以把浏览器模式改为 IE6:IE7 虽然也没有浏览器模式,但 IE8+ 可以把浏览器模式设置为 IE7 模式).但是从 IE8 开始引入的浏览器模式会产生不同的 UA.例如,IE9 有这些: 如果仅通过 UA 中的「MSIE X.0」来判断,会得到 IE7~9 三种不同结果. 实际上,对于 IE8+,根据 UA 字符串只能确定当前是否是兼容性

IE (第一部分) 浏览器 中 关于浏览器模式和文本模式的困惑

什么是浏览器模式和文本模式? 经常使用IE开发者工具的同学,肯定见过浏览器模式和文本模式,对于这两个名词,综合相关文档解释如下: 浏览器模式(Browser Mode),用于切换IE针对该网页的默认文本模式.对不同版本浏览器的条件注释解析.决定请求头里userAgent的值.它在浏览器发出请求之前就已经确定,网站没有办法修改这个值.它代表的是用户以何种浏览器访问网站.IE9支持下列浏览器模式: (IE9兼容性模式与IE7模式的区别是:前者在UA里加上了Trident版本,后者和IE7完全一致无T

Linux的图形模式和文本模式以及单用户模式切换

1.默认开机进入文本模式 如果想让开机自动进纯文本模式, 修改/etc/inittab 找到其中的 id:5:initdefault: 这行指示启动时的运行级是5,也就是图形模式 改成3就是文本模式了 id:3:initdefault: 这是因为Linux操作系统有六种不同的运行级(run level),在不同的运行级下,系统有着不同的状态,这六种运行级分别为: 0:停机(记住不要把initdefault 设置为0,因为这样会使Linux无法启动) 1:单用户模式,就像Win9X下的安全模式.

Recovery模式本地化文本显示(一、Framework层)

写在前面: 本系列博文所讨论的内容主要是与大家一起讨论Recovery模式本地化显示文本的原理,以及如何使用谷歌提供的recovery_l10n工具实现定制本地化显示的文本. 导读: 首先我们来讨论Recovery模式下本地化文本的显示是如何实现的. 先看两张图,相信很多人都很熟悉,第一张是我们恢复出厂设置操作,关机重启进入recovery模式之后所看到的界面,第二张是通过按键进入recovery模式,带有选项菜单的主界面.一般来说普通用户正常的操作是不会看到第二个界面的,而在第一张图片中我们看