如果是匹配以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

[root@localhost ~]#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先赋值再判断
    length(s)为真,执行s"\n"$0;s=s"\n"$0,将$0添加到s的下一行
    length(s)为假,执行$0

  man awk中length函数的解释

  length([s]) 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

 

pattern2{action2}
  匹配包含bbb的行
  s为从aaa开始的字符串
  判断字符串中是否包含ccc(正则表达式)
    满足条件,则打印s
    不满足将s变量置空

第二行
  不匹配aaa,由于第一行不满足bbb,所以t=1;
  执行{if(t)s=length(s)?s"\n"$0:$0}
    s值累加,继续将$0添加到s的下一行
  不匹配bbb,执行下一行

第三行
  不匹配aaa,继续将$0添加到s的下一行
  不匹配bbb,执行下一行

第四行
  不匹配aaa,继续将$0添加到s的下一行
  匹配bbb,执行{t=0;if(s~/ccc/)print s;s=""}
  将t置0,执行正则匹配,s是否包含ccc
    满足条件,打印s
    不满足条件,将s置空

一个循环结束(或者一个流程结束,若不满足条件则无法完成,后面的代码也就失去意义了)

改进:
length函数可以不用

awk '/aaa/{t=1}{if(t)s=s?s"\n"$0:$0}/bbb/{t=0;if(s~/ccc/)print s;s=""}' file

多种思路,感谢CU大神

awk '/^aaa/{t=1};/^bbb/{if(s~/ccc/){print s"\n"$0};s=a;t=0}t{s=s?s"\n"$0:$0}' file

awk '/^aaa/{s=$0;next};/^bbb/{if(s~/ccc/)print s"\n"$0;next}{s=s"\n"$0}' file

awk匹配以aaa开头,以bbb结尾的内容,同时aaa和bbb之间还包含ccc的更多相关文章

  1. php正则匹配以“abc”开头且不能以“xyz”结尾的字符串

    本文介绍下,用php正则区配以"abc"开头的,且不能以"xyz"结尾的字符串的方法,有需要的朋友参考下. 要求:用php正则表达式匹配以“abc”开头,但结尾 ...

  2. “.”开头,以"}"结尾,中间是任意字符的正则

    "."开头,以"}"结尾,中间是任意字符的正则 /^\..+\{$/

  3. 正则表达式,匹配非本站图片网址去掉img标签内容实例

    正则表达式,匹配非本站图片网址去掉img标签内容实例 在线正则表达式测试http://tool.oschina.net/regex/# 测试内容: <div><p>eee< ...

  4. awk匹配

    输出匹配funcno或type:awk 'funcno|type' 输出两次正则表达式匹配之间的行:awk '/funcno/, /type/' 删除所有的空行:awk NF 从第8行输出到第12行: ...

  5. awk处理之案例二:awk匹配文本

    编译环境 本系列文章所提供的算法均在以下环境下编译通过. [脚本编译环境]Federa 8,linux 2.6.35.6-45.fc14.i686 [处理器] Intel(R) Core(TM)2 Q ...

  6. awk匹配某一段内容,打印第一段

    要求: awk 文本在文本中搜索abc搜到后再从搜到的那一行开始一直输出后面的行,直到某一行含有bcd就停止 测试文本: [root@localhost]# cat awktest sadfj sdj ...

  7. [Swift]LeetCode984. 不含 AAA 或 BBB 的字符串 | String Without AAA or BBB

    Given two integers A and B, return any string S such that: S has length A + B and contains exactly A ...

  8. 正则,以“this.Name”开头,以“;”结尾

    string regex="this\\.Name(.*?);"; string regex="this\\.Name(.*?);"; 以size开头,以数字结 ...

  9. awk处理之案例五:awk匹配字段2包含字段1的文本

    编译环境 本系列文章所提供的算法均在以下环境下编译通过. [脚本编译环境]Federa 8,linux 2.6.35.6-45.fc14.i686 [处理器] Intel(R) Core(TM)2 Q ...

随机推荐

  1. MongoDB建立主从复制小案例(一主一从)

    花了两天学习了mongoDB, 今天接触到了mongo的主从配置, 把它记下来 1. 开启两个mongo服务器(用于一主一从, 没有加安全验证相关参数 : 可以使用mongd-help查看) mong ...

  2. python socket连接服务器获取回显

    军训回来了,皮皮..... import socket import sys try: s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #创建一个 ...

  3. 51 nod 1211 数独 DLX

    原题链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1211 调了挺久的,自己的一份舞蹈链模板…… 算是在网上见到的模 ...

  4. hdu_3003Pupu(快速幂)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3003 Pupu Time Limit: 2000/1000 MS (Java/Others)    M ...

  5. MVC学习笔记(分享)

    一.SpringMVC基础入门,创建一个HelloWorld程序 1.首先,导入SpringMVC需要的jar包. 2.添加Web.xml配置文件中关于SpringMVC的配置 <!--conf ...

  6. RPM包效验

  7. python之hashlib、configparser、logging模块

    hashlib模块 Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等. 什么是摘要算法呢?摘要算法又称哈希算法.散列算法.它通过一个函数,把任意长度的数据转换为一个长度固定的数 ...

  8. PageRank_网页排名_MapReduceJava代码实现思路

    PageRank 1.    概念 2.    原理   3.    java代码实现思路   1.定义收敛标准     每次算出新的pr-oldpr=差值 ,所有页面的差值累加 ,除以pagecou ...

  9. 宝塔服务器管理助手Linux面版-使用教程

    在顺利安装宝塔服务器linux面板之后,我们打开这个面板,UI界面设计的很简介,所有命令一看就知道是干什么用的,和我们以前用过的虚拟主机管理后台是很像的. 方法/步骤 1 使用方法如下: 面板地址:h ...

  10. [SinGuLaRiTy] 复习模板-数学

    [SinGuLaRiTy-1047] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. 质因数分解 void solve(int n) { == ...