诺亚方舟

沉淀

利用sed正则截取字符串

有时候我们在查日志,想提取日志中某个参数出来,这时候利用sed正则就可以实现这个功能了。命令格式:

echo XXXXxxxx| sed ‘s/xxxx/oooo/g’

这个命令的实质是利用替换,把匹配中的内容替换掉,s代表替换,第一个/和第二个/中间为匹配的内容,第二个/和第三个/中间代表替换成的内容,g表示把整行中所有符合匹配的都替换掉,如果是2g表示第二个匹配到的替换掉,3g、4g以此类推。/这个符合也可以用其他符号代替,例如:这个符号。下面看看一个实例:

首先看看几条记录:

1
2
3
4
cat tmp.txt
api.4399sy.com.s.log:0.007 117.136.11.204 - - [10/Oct/2016:02:00:08 +0800] "GET /oauth2/temp_login?sydid=&sign=ef4f2704ae031a7d52b935e1e8f7d37c&_ts=1476036008&client_id=1465802583522770&channel_id=1232&serverId=0&packageType=packageType_1&sdkVersion=3.7.16.7&did=867196028742953&device_id=867196028742953&appVersion=0.1.3&osVersion=4.4.4&nm=4G&areaId=0&screen=854*480&os=android&comeFrom=0&display=mobile&response_type=token&mno=CMCC&deviceType=android&device=vivo%2BY13L&ic=MeDo5OXx5Oi00fHo6LTI3fGJrOjF8Y2Q6MQ%253D%253D&sdk_type=1 HTTP/1.1" 200 154 "-" "Mozilla/5.0 (Linux; U; Android 4.4.4; zh-cn; vivo Y13L Build/KTU84P) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1" -
api.4399sy.com.s.log:0.006 117.136.11.204 - - [10/Oct/2016:02:00:13 +0800] "GET /oauth2/temp_login?sydid=&sign=ef4f2704ae031a7d52b935e1e8f7d37c&_ts=1476036012&client_id=1465802583522770&channel_id=1232&serverId=0&packageType=packageType_1&sdkVersion=3.7.16.7&did=867196028742953&device_id=867196028742953&appVersion=0.1.3&osVersion=4.4.4&nm=4G&areaId=0&screen=854*480&os=android&comeFrom=0&display=mobile&response_type=token&mno=CMCC&deviceType=android&device=vivo%2BY13L&ic=MeDo5OHx5Oi0yfHo6LTMyfGJrOjF8Y2Q6MQ%253D%253D&sdk_type=1 HTTP/1.1" 200 154 "-" "Mozilla/5.0 (Linux; U; Android 4.4.4; zh-cn; vivo Y13L Build/KTU84P) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1" -
api.4399sy.com.s.log:0.006 121.22.43.10 - - [10/Oct/2016:02:00:49 +0800] "GET /oauth2/temp_login?sydid=&sign=e7eae8cadc3d18184d3fdd3a397fac72&_ts=1476036042&client_id=1465802583522770&channel_id=6904&serverId=0&packageType=packageType_1&sdkVersion=3.7.16.7&did=868964020458772&device_id=868964020458772&appVersion=0.1.3&osVersion=5.1&nm=WIFI&areaId=0&screen=1920*1080&os=android&comeFrom=0&display=mobile&response_type=token&mno=CMCC&deviceType=android&device=vivo%2BX6Plus%2BD&ic=MeDozMnx5OjMxfHo6ODZ8Yms6MHxjZDow&sdk_type=1 HTTP/1.1" 200 154 "-" "Mozilla/5.0 (Linux; U; Android 5.1; zh-cn; vivo X6Plus D Build/LMY47I) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1" -

如果这时候我想提取did这个参数,可以这样搞:

1
2
3
4
cat tmp.txt |  sed 's/.*&did=\(.*\)&device_id.*/\1/g'
867196028742953
867196028742953
868964020458772

好,如愿以偿了,成功提取出did的值。上面sed的表达式意思是把整行匹配出来,然后替换成第一个括号的内容,也就是did的值,这里我们也可以一次性匹配多个值出来,正则表达式中第一个括号就是后面的\1,第二个括号的内容就是\2,以此类推。

 

注意:但是这个方法有很大的局限性,因为sed使用的正则是BREs/EREs,不支持非贪婪模式,所以出现会贪婪匹配的数据行时这个方法就不奏效了,可以考虑用awk内置的split或等等方法来切割统计。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>