awk实战12-进阶-再谈awk匹配模式

awk一个神奇而又强大的功能,绝对是一个开发利器,效率直选!希望这里的一些总结能帮到那些存在困惑的人!

awk实战1-基础语法说明

awk实战2-流程控制语句总结

awk实战3-awk数组技巧

awk实战4-函数系列-算数函数说明

awk实战5-函数系列-基本字符串函数

awk实战6-函数系列-字符串函数说明-asort和sub

awk实战7-函数系列-时间函数

awk实战8-函数系列-字节操作

awk实战9-IO函数-getline和close

awk实战10-IO函数-其他介绍

awk实战11-进阶-10种awk有效应用实战

awk实战12-进阶-再谈awk匹配模式

awk处理小问题-解决局部jar包替换

文章目录

    • 1 awk匹配模式
    • 2 匹配表达式
    • 2 模式匹配实例
    • 3 awk模式匹配总结

1 awk匹配模式

在awk介绍第一节提到,awk是由匹配模式和动作组成:

pattern { action }

#### 1-BEGIN和END两张特殊类型模式,没有针对输入进行测试
BEGIN
END
#### 2 BEGINFILE和ENDFILE是附加的特殊模式,它们的主体在读取每个命令行输入文件的第一条记录之前以及在读取每个文件的最后一条记录之后执行。 在BEGINFILE规则内,如果文件成功打开,ERRNO的值将为空字符串。 否则,文件存在一些问题,代码应使用nextfile跳过它。 如果没有这样做,gawk会对无法打开的文件产生通常的致命错误。
BEGINFILE
ENDFILE
#### 3 正则表达式模式在输入记录与正则表达式匹配时候执行关联语句,其表达形式与egrep语句相同
/regular expression/
relational expression
#### 4 &&逻辑与,||逻辑或 !逻辑非 ?:与c一样三目运算
pattern && pattern
pattern || pattern
pattern ? pattern : pattern
(pattern)
! pattern
#### 5 范围模式:它匹配与pattern1匹配的的所有输入记录,指导匹配patteran2的记录
pattern1, pattern2

大部分情况下都是按照这一个思路在编写awk的代码,写出这样的代码:

cat test | awk 'BEGIN {print "SUM:"} {print $1} END {print "END SUM!!!"}'

但是实际上除了BEGIN和END外很少使用匹配多个条件,实际上awk的语法应该是这样的:

awk ‘pattern{action}pattern{action}…’ file

这里的理解是:如果条件1满足执行动作1并退出,否则执行下一个条件判断,依次类推!!!

也就是说每一个模式都是一个独立条件判断,类似于if (...){...}else if(...){...} else if(....){...}else {}

模式匹配满足一个条件条件执行完后就马上开启下一个!

2 匹配表达式

字符 说明
c 匹配字符c
\c 匹配文字字符c
* 匹配任何一个字符
$ 匹配字符串尾部
[abc…] 匹配由abc组成的任何字符
[^abc…] 匹配不是由abc组成的任何字符
r1|r2 任意匹配r1或者r2
r1r2 先匹配r1再匹配r2
r+ 匹配一到多次r
r* 匹配0到多次r
r? 匹配0到1一次r
® 匹配组r
r{n} 匹配n次r
r{n,} 匹配大于n次r
r{n,m} 匹配n-m次r
\y 匹配空字符串无论是在开头还是结尾
\B 匹配单词中的空字符串
\< 匹配单词开头的空字符串
\> 匹配单词结尾的空字符串
\s 匹配任何空白字符
\S 匹配任何非空白字符
\w 匹配任何单词字符
匹配任何非单词字符
\` 匹配buffer开头空字符串
\’ 匹配buffer结尾空字符串

2 模式匹配实例

如下所示有个一文档a.log:

hello  123    123 
wang   100    bcd
zhng   180    abc
abc

使用表达式awk如下所示:

awk '$1~/wang/{$2=$2+300} NR==2 {print $0}' a.log

最后结果显示为:

user@user:~/$ awk '$1~/wang/{
     $2=$2+300} NR==2 {print $0}' a.log
wang 400 bcd

我们改变一下条件顺序:

user@user:~/$ awk 'NR==2 {print $0} $1~/wang/{
     $2=$2+300}' a.log
wang   100    bcd

可以发现虽然两个模式条件都能匹配第二行,但是实际上只要满足了第一个条件,该行的模式匹配就直接完成了!!!

3 awk模式匹配总结

  • awk的模式匹配就相当于我们平日代码的if (...){...}else if(...){...} else if(....){...}else {},优先匹配完就会返回;

  • awk的条件和动作可以二者缺一,但是不能两者全部缺失

    awk '$1~/wang/{$2=$2+300} 1' a.log这个1就是当前面条件不满足时候默认为真的一个补充条件,而此时动作也是默认动作,也就是{print $0}

  • BEGIN和END就是两个特殊条件,他们不跳转行,但是第一次启动awk和最后一行完成后必然会进入BEGIN或者END;他们同样符合这个原则!

你可能感兴趣的:(awk实战,awk实战,匹配模式)