背景
需要从一个文件中逐行的数据中提取出符合要求的子串,比如提取其中tagA*****tagB之间的字符
基于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:欢迎留言,提供更多便捷方案。