- 论坛徽章:
- 2
|
本帖最后由 irockey 于 2017-07-06 20:26 编辑
如果是匹配以A开头,以B结尾的内容,同时A和B之间还包含C的这种怎么做?
比如
- [root@localhost ~]#cat file
- aaa
- grge
- ddd
- bbb
- aaa gege
- ccc
- bbb
- aaa gregeg
- eee
- bbb
复制代码
这个中A=aaa,B=bbb,C=ccc,那么要提取出下面的……
aaa gege
ccc
bbb
awk '/aaa/{t=1}{if(t)s=length(s)?s"\n"$0:$0}/bbb/{t=0;if(s~/ccc/)print s;s=""}' file
第一行
pattern1{action1}
匹配包含aaa的行,满足条件令t=1,当t=1时,if条件为真,执行s=length(s)?s"\n"$0:$0
这里s=length(s)?s"\n"$0:$0又是一个判断,s=length(s)为真,执行s"\n"$0,否则执行$0
s是自定义变量,当s未定义时,s="",
man awk中length函数的解释
length() Return the length of the string s, or the length of $0 if s is not supplied.
length(s)=length($0),即length(aaa)=3,表达式为真,此时执行第1个表达式 s"\n"$0
- [root@localhost ~]#echo "aaa" | awk '{s=length(s)?s"\n"$0:$0}END{print s}'
- aaa
- [root@localhost ~]#echo "aaa" | awk '{s=length(s)}END{print s}'
- 0
复制代码
这里是不是要把length(s)?s"\n"$0:$0看做一个整体,这是优先级原因么?感觉我上面的理解是错误的
pattern2{action2}
匹配包含bbb的行
s为从aaa开始的字符串
判断字符串中是否包含ccc(正则表达式)
满足条件,则打印s
不满足将s变量置空
第二行
不匹配aaa,
我不知道我哪一步开始理解错了,请大神指点下
|
|