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]$/
2 ($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;}'
使用 awk 命令过滤来打印想要的根目录文件,以下过滤条件为:#3==rot
# dir -l | awk '$3=="root" {print $1,$3,$4, $9;}
这个命令使用 $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}'
以上使用 ~ /pattern/ 比较操作符,输出一些重要信息
使用另一个命令作为awk的输入,代替awk的输入,非常容易地实现各种功能
转载于:https://blog.51cto.com/risingair/1866656