sed或者awk命名模式匹配

背景
需要从一个文件中逐行的数据中提取出符合要求的子串,比如提取其中tagA*****tagB之间的字符

基于sed方式的子串提取
cat  my.log | sed 's/\(.*\)tagA\(.*\)tagB\(.*\)/\2/g'
1
可以搭配grep先进行一次行过滤,在之后,再进行一次的子串提取:
s: 表示替换命令
(.*)tagA : 表示tagA前的内容
tagA(.*)tagB:表示tagA和tagB之间的内容
tagB(.*):表示tagB后的内容
\2: 表示第二对括号里面的内容
括号里的表达式匹配的内容,可以用\1,\2等进行引用,第n个括号对内的内容,就用\n引用。
这个命令的意思是:
用\2代表的第二个括号的内容(即tagA好tagB之间的内容)去替换整个字符串,这样就得到了我们所需要的子字符串了。

grep 'id=myid'  my.log | sed 's/\(.*\)tagA\(.*\)tagB\(.*\)/\2/g'
1
方案2:
采用awk和match的方案:通过match匹配出tagA的位置和tagB的位置,分别即为start1和start2,再通过substr进行字符串的截取,从而实现预期子串的提取。代码如下:

cat  my.log | awk '{start1=match($0,/GET/);start2=match($0,/HTTP/);print start1,start2;print substr($0,start1+4,start2-start1-4)}'
1
其中start1中+4表示将tagA这4个字符跳过。当然,前期使用grep进行一次过滤,再使用awk和match进行二次处理可以达到各种预期的目的。
PS:欢迎留言,提供更多便捷方案。
————————————————
版权声明:本文为CSDN博主「JasonLiu1919」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/ljp1919/article/details/53337670

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值