如何使用Awk过滤文本或字符串使用模式特定操作

在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
打印价格大于$ 2的商品

打印价格大于$ 2的商品

从上面的输出,你可以看到,有一个(*)的有食品, 芒果菠萝行的结束标志。 如果你检查他们的价格,他们是高于$ 2 在这个例子中,我们使用了两种模式:
  1. 第一: / *\$[2-9]\.[0-9][0-9] */获取具有行食品价格高于$ 2
  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过滤和打印项目

使用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和变量过滤和打印项目

结论

这就是它现在和这些使用模式的具体操作,可使用awk命令标记文本或字符串线在一个文件中有助于过滤文本的简单方法。 希望你觉得这篇文章有帮助,并记住阅读系列的下一部分,将重点使用比较运算符使用awk工具。