sed方法进行模式串匹配

转自 http://blog.csdn.net/ljp1919/article/details/53337670

背景

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

方案1:基于sed方式的子串提取

cat my.log | sed 's/\(.*\)tagA\(.*\)tagB\(.*\)/\2/g'

可以搭配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'

方案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)}'

其中start1中+4表示将tagA这4个字符跳过。当然,前期使用grep进行一次过滤,再使用awk和match进行二次处理可以达到各种预期的目的。 
PS:欢迎留言,提供更多便捷方案。

posted @ 2018-01-13 13:59  princessd8251  阅读(410)  评论(0)    收藏  举报