AWK 使用比较操作符:过滤文本和字符串                                                              

Awk比较操作符?

> – 大于

< – 小于

>= –大于等于

<= – 小于等于

== – 等于

!= – 不等于

some_value ~ / pattern/ – true 如果 some_value 匹配 pattern

some_value !~ / pattern/ – true 如果 some_value 不匹配 pattern

对小于等于30美元的食品,在行尾增加旗 (**)

food_list.txt文件

No      Item_Name               Quantity        Price
1       Mangoes                    45           $3.45
2       Apples                     25           $2.45
3       Pineapples                 5            $4.45
4       Tomatoes                   25           $3.45
5       Onions                     15           $1.45
6       Bananas                    30           $3.45

句法

# expression { actions; }

# awk '$3 <= 30 { printf "%s\t%s\n", $0,"**" ; } $3 > 30 { print $0 ;}' food_list.txt
No Item_Name` Quantity Price
1 Mangoes           45 $3.45
2 Apples    25 $2.45 **
3 Pineapples    5 $4.45 **
4 Tomatoes    25 $3.45 **
5 Onions    15           $1.45 **
6 Bananas    30           $3.45 **

1.表达式1 { 角色 } 结合, $3 <= 30 { printf “%s\t%s\n”, $0,”**” ; } 打印出小于

  等于30美元的项并附加(**)旗在行尾,其它使用$3域

         2.表达式2 { 角色 } 结合, $3 > 30 { printf $0 ;} 打印出未改变的项目

# awk '$3 <= 20 { printf "%s\t%s\n", $0,"TRUE" ; } $3 > 20  { print $0 ;} ' food_list.txt
No Item_Name Quantity Price
1 Mangoes    45 $3.45
2 Apples    25 $2.45
3 Pineapples    5 $4.45 TRUE
4 Tomatoes    25 $3.45
5 Onions    15           $1.45 TRUE
6       Bananas                    30           $3.45

以上为小于等于20美元的增加旗


Awk中使用复合表达式

Awk中使用 && 作为 (and) 、使用|| 作为 (or)的复合表达式.

表达式句法:

( first_expression ) && ( second_expression )

这里, first_expression 和 second_expression 必须为:true

( first_expression ) || ( second_expression)

这里,  first_expression 或 second_expression 必须有一个为: true.

注意: 总是包涵括号;表达式操作符见上面

以下的例子:文本文件 tecmint_deals.txt

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 匹配为:true时执行 /^\$[2-9][0-9]*\.[0-9][0-9]$/

($4 == “Tech”) ; 检测是否处理 “Tech” 同时为 true时:$4 等于 “Tech”.

注意:一行设置旗,使用 (**), 第一个、第二个表达式为:true需使用 && 操作符.

Awk中‘next’ 命令 

next 命令:避免执行浪费的步骤,直接读取下一行,你需要的内容

食物列表项

No      Item_Name               Price           Quantity
1       Mangoes                 $3.45              5
2       Apples                  $2.45              25
3       Pineapples              $4.45              55
4       Tomatoes                $3.45              25
5       Onions                  $1.45              15
6       Bananas                 $3.45              30

在等于20价格行尾追加(*)标志的旗 

# awk '$4 <= 20 { printf "%s\t%s\n", $0,"*" ; } $4 > 20 { print $0 ;} ' food_list.txt 
No Item_Name Price Quantity
1 Mangoes $3.45   5 *
3 Pineapples $4.45              55
4 Tomatoes $3.45              25
5 Onions $1.45              15 *

以下是实际工作过程:

首先检测每一个输入行,找出等于 20的行, 如果满足条件打印 (*) 标志在行尾巴。使用表达式:$4 <= 20

其次,是检测每一个输入行,找出大于 20的输入行, 如果满足第二个条件: $4 > 20;输出结果

在第一个表达式执行时,设置满足条件的旗,使用:{ printf "%s\t%s\n", $0,"**" ; } ;然后,相同的步骤执行第二个表达式。$4 > 20 ;从而造成浪费。

使用 next 命令处理问题:

# awk '$4 <= 20 { printf "%s\t%s\n", $0,"*" ; next; } $4 > 20 { print $0 ;} ' food_list.txt
No Item_Name Price Quantity
1 Mangoes $3.45    5 *
3 Pineapples $4.45              55
4 Tomatoes $3.45              25 
5 Onions $1.45              15 *

打印单一输入行 $4 <= 20 { printf "%s\t%s\n", $0,"*" ; next ; }next 帮助跳过第二个表达式 $4 > 20 { print $0 ;}, 结果执行下一个输入行没有浪费时间,检测输入行是否大于20 


Awk 从STDIN输入

使用 dir -l命令作 Awk 输入来打印拥有者的 username, groupname  及目录下的所有文件:


# dir -l | awk '{print $3, $4, $9;}'

wKiom1gTH6PBk2FOAAAq_3hH0iw574.png


使用 awk 命令过滤来打印想要的根目录文件,以下过滤条件为:#3==rot


# dir -l | awk '$3=="root" {print $1,$3,$4, $9;} 

wKioL1gTIDSStVS_AAAURu4lOUA942.png


这个命令使用 $3==”root”过滤.


以下为使用 cat utility 包来看文件的内容。以下是:tecmint_deals.txt 文件且仅查看Tech


类型文件

# cat tecmint_deals.txt
# cat tecmint_deals.txt | awk '$4 ~ /tech/{print}'
# cat tecmint_deals.txt | awk '$4 ~ /Tech/{print}'

wKioL1gTISrjZPk-AABAurRpJEo161.png


以上使用 ~ /pattern/ 比较操作符,输出一些重要信息


使用另一个命令作为awk的输入,代替awk的输入,非常容易地实现各种功能