shell文本过滤编程(三):awk之条件判断

时间:2021-09-21 16:07:01
【版权声明:转载请保留出处:blog.csdn.net/gentleliu。Mail:shallnew at 163 dot com】
在之前grep章节中用到很多正则表达式,这一节将在awk条件操作中使用正则表达式。awk 允许使用正则表达式,根据正则表达式是否匹配当前行来选择执行独立代码块。
下面先给出awk的条件操作符:
<       小于
<=    小于等于
==   等于
!=     不等于
>     大于
>=    大于等于
~     匹配正则表达式
!~     不匹配正则表达式
这一节继续使用上一节操作文件
1. 匹配
我们如果想筛选只符合条件(比如只要组名为aln)的行,可以这样写:
## awk '$1~/aln/{print}' group_file1
aln x 1001
# awk'/aln/{print}' group_file1
aln x 1001
# awk '{if ($1 ~/aln/)print}' group_file1
aln x 1001
# awk '$1~/aln/'group_file1 //没有具体动作(如print),可以不用花括号,缺省动作是打印所有匹配记录。
aln x 1001
         上面四种方法都是打印第一个域包含aln的行,同理!~操作符号使用方法相同。
2. 精确匹配
如果要精确匹配,可以使用==操作符。  例如:
# awk '$3 =="984"{print}' group_file1vboxusers x 984allen
# awk '{if($3=="984")print}' group_file1
vboxusers x 984allen
# awk'$3=="984"' group_file1
vboxusers x 984allen
#
!=操作符号使用类似。
3. 大于
下面示例使用如下被操作文件:
# catgroup_file2wireshark x 987123
usbmon x 986 999
jackuser x 985 985
vboxusers x 9841003 allen
aln x 1001 787
以下示例输出满足$3 > $4的行的组名称:
# awk '{if($3>$4)print $1}' group_file2wiresharkaln# awk'$3>$4{print $1}' group_file2wiresharkaln
操作符号<=、>、>=使用类似。
4. 行首匹配
# awk'$1~/^....user/' group_file2jackuser x 985985
vboxusers x 9841003 allen
# awk '{if($1~/^....user/)print}' group_file2
jackuser x 985985
vboxusers x 9841003 allen
awk 还允许使用布尔运算符 "||"(逻辑与)和"&&"(逻辑或),以便创建更复合布尔表达式,复合表达式即为模式间通过使用下述各表达式互相结合起来的表达式:
&& AND :语句两边必须同时匹配为真。
|| OR:语句两边同时或其中一边匹配为真。
! 非求逆
5. 求与:
# awk'$1~/^....user/ && $3==985' group_file2jackuser x 985985
# awk '{if($1~/^....user/ && $3 == 985)print}' group_file2
jackuser x 985985
6. 求或
# awk '{if($1~/^....user/ || $3 == 1001)print}' group_file2jackuser x 985985vboxusers x 9841003 allenaln x 1001 787
7. 求非
# awk'!($1~/^....user/)' group_file2wireshark x 987123usbmon x 986 999aln x 1001 787