网站搜索

如何在 Linux 中通过 Awk 使用复合表达式 - 第 5 部分


一直以来,我们在检查条件是否满足时一直在查看简单的表达式。如果您想使用多个表达式来检查特定条件怎么办?

在本文中,我们将了解如何组合多个表达式(称为复合表达式)来在过滤文本或字符串时检查条件。

Awk 中,复合表达式是使用称为 (and)&&| 构建的。 | 称为(或) 复合运算符。

复合表达式的一般语法是:

( first_expression ) && ( second_expression )

这里,first_expressionsecond_expression 必须为 true 才能使整个表达式为 true。

( first_expression ) || ( second_expression) 

此处,first_expressionsecond_expression 中的一个表达式必须为 true,整个表达式才为 true。

警告:请记住始终包含括号。

可以使用我们在 awk 系列第 4 部分中介绍的比较运算符来构建表达式。

现在让我们通过下面的例子来清楚地理解:

在此示例中,有一个名为 howtoing_deals.txt 的文本文件,其中包含一些令人惊叹的随机 Howtoing 交易的列表,其中包括交易名称、价格和类型。

No      Name                                    Price           Type
1       Mac_OS_X_Cleanup_Suite                  $9.99           Software
2       Basics_Notebook                         $14.99          Lifestyle
3       Tactical_Pen                            $25.99          Lifestyle
4       Scapple                                 $19.00          Unknown
5       Nano_Tool_Pack                          $11.99          Unknown
6       Ditto_Bluetooth_Altering_Device         $33.00          Tech
7       Nano_Prowler_Mini_Drone                 $36.99          Tech 

假设我们只想打印并标记高于 $20 且类型为 “Tech ” 的交易,并在末尾使用 (**) 符号每行的。

我们需要运行下面的命令。

# awk '($3 ~ /^$[2-9][0-9]*\.[0-9][0-9]$/) && ($4=="Tech") { printf "%s\t%s\n",$0,"*"; } ' tecmint_deals.txt 

6	Ditto_Bluetooth_Altering_Device		$33.00		Tech	*
7	Nano_Prowler_Mini_Drone			$36.99          Tech	 *

在此示例中,我们在复合表达式中使用了两个表达式:

  1. 第一个表达式 ($3 ~ /^\$[2-9][0-9]*\.[0-9][0-9]$/) ;检查价格高于 $20 的交易行,并且仅当价格 $3 的值与模式 /^\$[ 匹配时才为真2-9][0-9]*\.[0-9][0-9]$/
  2. 第二个表达式 ($4 == “Tech”) ;检查交易是否属于“科技”类型,并且仅当$4的值等于“科技”时才为真。

请记住,只有当第一个表达式第二个表达式为 true 时,才会用 (**) 标记一行,正如说明的原则一样。 && 运算符。

概括

有些条件总是需要构建复合表达式才能完全匹配您想要的内容。当您了解比较和复合表达式运算符的使用时,根据一些困难的条件过滤文本或字符串将变得很容易。

希望您发现本指南有用,对于任何问题或补充,请始终记住发表评论,您的疑虑将得到相应解决。