在之前grep章节中用到很多正则表达式,这一节将在awk条件操作中使用正则表达式。awk 允许使用正则表达式,根据正则表达式是否匹配当前行来选择执行独立代码块。
下面先给出awk的条件操作符:
< 小于
<= 小于等于
== 等于
!= 不等于
> 大于
>= 大于等于
~ 匹配正则表达式
!~ 不匹配正则表达式
这一节继续使用上一节操作文件
1. 匹配
我们如果想筛选只符合条件(比如只要组名为aln)的行,可以这样写:
## awk '$1~/aln/{print}' group_file1上面四种方法都是打印第一个域包含aln的行,同理!~操作符号使用方法相同。
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
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以下示例输出满足$3 > $4的行的组名称:
usbmon x 986 999
jackuser x 985 985
vboxusers x 9841003 allen
aln x 1001 787
# awk '{if($3>$4)print $1}' group_file2wiresharkaln# awk'$3>$4{print $1}' group_file2wiresharkaln操作符号<=、>、>=使用类似。
4. 行首匹配
# awk'$1~/^....user/' group_file2jackuser x 985985awk 还允许使用布尔运算符 "||"(逻辑与)和"&&"(逻辑或),以便创建更复合布尔表达式,复合表达式即为模式间通过使用下述各表达式互相结合起来的表达式:
vboxusers x 9841003 allen
# awk '{if($1~/^....user/)print}' group_file2
jackuser x 985985
vboxusers x 9841003 allen
&& AND :语句两边必须同时匹配为真。
|| OR:语句两边同时或其中一边匹配为真。
! 非求逆
5. 求与:
# awk'$1~/^....user/ && $3==985' group_file2jackuser x 9859856. 求或
# awk '{if($1~/^....user/ && $3 == 985)print}' group_file2
jackuser x 985985
# awk '{if($1~/^....user/ || $3 == 1001)print}' group_file2jackuser x 985985vboxusers x 9841003 allenaln x 1001 7877. 求非
# awk'!($1~/^....user/)' group_file2wireshark x 987123usbmon x 986 999aln x 1001 787