在使用awk进行统计时候,突然有这样的需求,如下为一个文本集合,简化一下我最终的需求吧,我需要对这个文本中进行判断是否存在/**/**/这种格式,如果存在就提取/**/**/这个内容,后面的内容则不再需要,内容如下:本文地址:http://www.04007.cn/article/534.html,未经许可,不得转载.
这里的这行内容已经是在使用了awk进行提取的前提下得到的内容,所以不要简单想成直接使用awk进行操作,当然你先一步awk来提出来这些内容,再第二次用awk进行统计也可以实现我这简单描述的需求,但是如果前期处理比较复杂那就不适用了,开始我想到的是awk的index方法,但是index方法只返回是否找到字符而不会区分能查找到的次数。在我觉得不好办的时候,发现了split方法可以使用。如下:本文地址:http://www.04007.cn/article/534.html,未经许可,不得转载.
[online@G18 ~ ~]$ cat t.log /ipad/cover/reums/hs/hello.php /ipad/ssbum/kkk.test /coer/lbum/iphone/regh/vs/ts.json /ipad/channel/tv.com /reqs/apkncent.php?username=yesmi /covr/abu/iphone/regh/hs/?think /sets/apt?k=name [online@G18 ~ ~]$ awk '{print index($0, "/")}' t.log 1 ..... [online@G18 ~ ~]$ awk '{if ($0 ~ /\/[^\/]*\/[^\/]*\//) {split($0,Array,"/"); print "/"Array[2]"/"Array[3]"/";} }' t.log /ipad/cover/ /ipad/ssbum/ /coer/lbum/ /ipad/channel/ /covr/abu/如上,在我觉得只能使用split方法的时候,我看到了match方法中的功能提示:(match( String, Ere ) 在String 参数指定的字符串(Ere 参数指定的扩展正则表达式出现在其中)中返回位置(字符形式),从 1 开始编号,或如果 Ere 参数不出现,则返回 0(零)。RSTART 特殊变量设置为返回值。RLENGTH 特殊变量设置为匹配的字符串的长度,或如果未找到任何匹配,则设置为 -1(负一)。 注意看:match中RLENGTH 特殊变量设置为匹配的字符串的长度,让我对match也充满了希望,经过测试这个也是可行的。经过多次调试得到了如下可行的办法:本文地址:http://www.04007.cn/article/534.html,未经许可,不得转载.
[online@G18 ~ ~]$ awk '{if(s=match($0, /\/[^\/]*\/[^\/]*\//)) print s,RSTART,RLENGTH, substr($0, RSTART, RLENGTH);}' t.log 1 1 12 /ipad/cover/ 1 1 12 /ipad/ssbum/ 1 1 11 /coer/lbum/ 1 1 14 /ipad/channel/ 1 1 10 /covr/abu/本文地址:http://www.04007.cn/article/534.html,未经许可,不得转载.
本文地址:http://www.04007.cn/article/534.html 未经许可,不得转载. 手机访问本页请扫描下方二维码: