读书人

帮忙解析下这段日志awk或者sed。解决

发布时间: 2012-03-23 12:06:21 作者: rapoo

帮忙解析下这段日志,awk或者sed。

Assembly code
-  113.133.123.123  2012-02-10 14:00:03  "GET http://stat.abc.com:3128/aop?a=123&b=23&c=24d=200|ab122|a12|sd1223d|324&e=2321"-  219.114.114.123  2012-02-10 14:00:03  "GET http://stat.abc.com:3128/aop?a=123&b=23&c=24d=200|ab12|2|asd|324&e=2321"119.41.13.17  113.31.123.123  2012-02-10 14:00:03  "GET http://stat.abc.com:3128/aop?a=123&b=23&c=24d=200|ab|122|asd|324&e=2321"-  211.139.21.197  2012-02-10 14:00:03  "GET http://stat.abc.com:3128/aop?a=123&b=23&c=24d=200|ab1|22|2d|324&e=2321"-  112.65.123.232  2012-02-10 14:00:03  "GET http://stat.abc.com:3128/aop?a=123&b=23&c=24d=200|a222|asd|324&e=2321"221.21.11.121  113.31.1.27  2012-02-10 14:00:03  "GET http://stat.abc.com:3128/aop?a=123&b=23&c=24d=200|ab|asd|324&e=2321"


字段用两个空格分隔。
以下是一行:
Assembly code
-  113.133.123.123  2012-02-10 14:00:03  "GET http://stat.abc.com:3128/aop?a=123&b=23&c=24d=200|ab122|asd|324&e=2321"


我想要的结果如下,用tab分隔。
ip+"\t"+a+"\t"+ b+"\t"+ c+"\t"+ 200+"\t"+ab122|asd+"\t"+324+"\t"+e
红色部分是d参数解析出来的。
ip;有两个ip的,只取第一个ip,第一个为“-”取第二个ip

求帮忙,我就会分割出来,分出来的就不会了。求个完整的





[解决办法]
写了一部分看看。
Python code
$ sed -r -n '/^-.*$/s/^.*(([0-9]{3}(\.|\b)){4}).*a\=([0-9]+)\&b\=([0-9]{2})\&c\=([0-9]+)d\=([0-9]+)\|(.*)\|([0-9]{3}).*$/\1 \2 \3 \5 \6 \7 \8 \9/p' file113.133.123.123 123  23 24 200 ab122|a12|sd1223d 324219.114.114.123 123  23 24 200 ab12|2|asd 324
[解决办法]
一个awk脚本,一堆sub搞定
Assembly code
# cat ./parse.awk #!/usr/bin/awk -fBEGIN {    FS="  |="}{    ip=$1    if (ip == "-")        ip = $2    gsub(/[^0-9]/, "", $5)    gsub(/[^0-9]/, "", $6)    gsub(/[^0-9]/, "", $7)    gsub(/[^0-9]/, "", $9)    n=split($8, d, "|")    gsub(/[^0-9]/, "", d[n])    sub(/[0-9]*\|/, "", $8)    sub(/\|[0-9]*&e$/, "", $8)    print ip,$5,$6,$7,d[1],$8,d[n],$9} 

读书人网 >UNIXLINUX

热点推荐