linux下awk 按模式筛选文本或字符串

作为 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

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

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

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

时间: 2024-09-15 10:59:17

linux下awk 按模式筛选文本或字符串的相关文章

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

作为 awk 命令系列的第三部分,这次我们将看一看如何基于用户定义的特定模式来筛选文本或字符串. 在筛选文本时,有时你可能想根据某个给定的条件或使用一个可被匹配的特定模式,去标记某个文件或数行字符串中的某几行.使用 awk 来完成这个任务是非常容易的,这也正是 awk 中可能对你有所帮助的几个功能之一. 让我们看一看下面这个例子,比方说你有一个写有你想要购买的食物的购物清单,其名称为 food_prices.list,它所含有的食物名称及相应的价格如下所示: $ cat food_prices.

c++-linux下C++无线网卡模式转换socket的问题

问题描述 linux下C++无线网卡模式转换socket的问题 linux下C++编程,由网卡模式转换到AP模式,再由AP模式转换到网卡模式时,链接不上. 发现第二次连接的新建的SOCKET(其中socket数值有和第一次的相同的) 只能bind()不能connect().请问大神可能是什么问题? 解决方案 你是客户端为何要bind() 要是你是服务端,又为何用connect()呢?

文本查询-linux下如何输出最后一行含制定字符串的文件名及该行内容

问题描述 linux下如何输出最后一行含制定字符串的文件名及该行内容 例如存在3个文件,tmp1,tmp2,tmp3 . 需要获取最后行含ERROR的,结果中同时显示文件名和该行内容. tail -n 1 tmp? |grep 'ERROR' ##无法打印文件名 求各位大神指教.

linux下awk命令语法及使用实例教程

linux awk命令使用实例,awk是一种文本处理工具,在linux shell下尤为突出, 一个awk脚本通常由:BEGIN语句块.能够使用模式匹配的通用语句块.END语句块3部分组成,这三个部分是可选的.实例: awk 'BEGIN{ print "start" } pattern{ commands } END{ print "end" }' file BEGIN语句块在awk开始从输入流中读取行之前被执行,这是一个可选的语句块,比如变量初始化.打印输出表格

look: Linux 下验证拼写并显示以某字符串开头的行的命令

你有没有感到需要一款Linux下的命令行工具,它可以验证你的拼写?一款可以显示包含特定前缀字符串的行?好的,本篇中,我们会讨论Linux下的 look命令,它满足了上面的这些要求. Linux下的look命令 下面是来自look命令man页面描述的截图: 测试环境 OS – Ubuntu 13.04 Shell – Bash 4.2.45 Application – look 2.20.1-5.1ubuntu8 简要教程 现在让我们通过一些特定例子来讨论这个命令. 假设你要验证单词'rendez

Linux下AWK使用练习

环境 RedHat Linux 9 + VWWare 8.0 + SSH 3.2.9 任务 下面的文本中包含名字.电话和为党派运动捐款的数额. 名字:电话:1月捐 款情况:2月捐款情况:3月捐款情况 Mike Harrington :(510) 548- 1278:250:100:175 Christian Dobbins:(408) 538-2358:155:90:201 Susan Dalsass:(206) 654-6279:250:60:50 Archie McNichol:(206)

Linux下awk内置变量使用介绍

我们将逐渐揭开 awk 功能的神秘面纱,在本节中,我们将介绍 awk 内置built-in变量的概念.你可以在 awk 中使用两种类型的变量,它们是:用户自定义user-defined变量和内置变量. 我们将逐渐揭开 awk 功能的神秘面纱,在本节中,我们将介绍 awk 内置built-in变量的概念.你可以在 awk 中使用两种类型的变量,它们是:用户自定义user-defined变量和内置变量.awk 内置变量已经有预先定义的值了,但我们也可以谨慎地修改这些值. awk 内置变量包括: FI

linux下Awk简单过滤示例

简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理. awk有3个不同版本: awk.nawk和gawk,未作特别说明,一般指gawk,gawk 是 AWK 的 GNU 版本. awk其名称得自于它的创始人 Alfred Aho .Peter Weinberger 和 Brian Kernighan 姓氏的首个字母.实际上 AWK

浅析linux下如何用脚本自动发送文本mail邮件_linux shell

1. 安装msmtp luther@gliethttp:~$ sudo apt-get install msmtp 2. 编辑配置脚本(~/.msmtprc是默认配置文件,也可以使用-C选项指定配置文件路径) luther@gliethttp:~$ vim msmtprc #添加如下内容 defaults #logfile /home/luther/msmtp.log account luther_test host mail.gliethttp.cn from luther@gliethttp