免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3248 | 回复: 4
打印 上一主题 下一主题

关于apache 的access_log 中url 参数的提取问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-03-25 09:42 |只看该作者 |倒序浏览
需求: 从apache的 access_log中提取日志记录,插入到数据库中,基本信息都已经提取出来了。
       现在遇到一个难题,就是需要把url中的参数分析出来。

经过处理后的数据文件格式如下:
cat data.txt     一共有7行
----------------------------------
pid=100&type=1
pid=105&type=2&Sortid=1
Themeid=1002&Sortid=3&offid=102
Themeid=1002&Sortid=4&offid=102&page=1
pid=101

Themeid=1002&Sortid=3&offid=102&&page=2&from=jdk
----------------------------------

期望输出的结果为:
格式:   参数1 参数1值 参数2 参数2值 ...   ( 参数1 参数1值  对应数据库中的字段)
pid  piddata tpye  tpyedata  Sortid Sortiddata  Themeid Themeiddata offid offiddata page pagedata from fromdata

要求没有符合条件的记录空出位置,填充“-”,空行也要保留,这样是为了跟其他已经提取出来的行数据保持一致。

即:   输出结果也为7行。
pid  100  type 1     -      -       -        -          -     -        -    -     -      -
pid  105  type 2     -      -       -        -          -     -        -    -     -      -
-      -      -       -  Sortid 3 Themeid 1002 offid 102     -    -     -      -
-      -      -       -  Sortid 4 THemeid 1002 offid 102 page 1    -      -
pid  101  -       -     -      -       -        -          -     -        -    -     -      -
-      -      -       -     -      -       -        -          -     -        -    -     -      -
-      -      -       -  Sortid 3 Themeid 1002 offid 102 page 1 from jdk


下面是我处理的脚本:
因为参数并不是很多,我想针对每一个参数如:pid进行分析, 然后再通过paste进行合并。
#!/bin/awk -f
#my.awk

BEGIN {FS="[&=]"; OFS="[|]"}
{
    for(i=1;i<=NF;i++)
   {
       if( $i ~/pid/ )
       printf NR"\t"$i"\n"
   }
}

输出结果:
awk -f my.sh data.txt

行号  pid   值
1       pid=100
2       pid=105
5       pid=101

但是空行无法打印出来,只是记录了行号,如果按照 NR 循环进行排序,会有N多重复数据。

或者可以通过一个数组把所有参数列进去,进行比较,把符合条件的参数和对应的值按照格式打印出来。

不知道我描述的明白与否,还请高手指点。

论坛徽章:
0
2 [报告]
发表于 2008-03-25 14:02 |只看该作者
  1. [root@myhost test]# cat c.awk
  2. BEGIN{
  3. FS="&"
  4. }
  5. function anlzz(x)
  6. {
  7.         a=""
  8.         if (x~/pid=/){a=a"pid "gensub(/.*pid=([^&]+).*/,"\\1",1,x)}else{a=a"- -"}
  9.         if (x~/type=/){a=a" type "gensub(/.*type=([^&]+).*/,"\\1",1,x)}else{a=a" - -"}
  10.         if (x~/Sortid=/){a=a" srotid "gensub(/.*Sortid=([^&]+).*/,"\\1",1,x)}else{a=a" - -"}
  11.         if (x~/Themeid=/){a=a" Themeid "gensub(/.*Themeid=([^&]+).*/,"\\1",1,x)}else{a=a" - -"}
  12.         if (x~/offid=/){a=a" offid "gensub(/.*offid=([^&]+).*/,"\\1",1,x)}else{a=a" - -"}
  13.         if (x~/page=/){a=a" page "gensub(/.*page=([^&]+).*/,"\\1",1,x)}else{a=a" - -"}
  14.         if (x~/from=/){a=a" from "gensub(/.*from=([^&]+).*/,"\\1",1,x)}else{a=a" - -"}
  15.         return a
  16. }

  17. {print anlzz($0)}
复制代码
awk -f c.awk filename

[ 本帖最后由 nuclearxin 于 2008-3-25 14:29 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2008-03-25 18:01 |只看该作者
多谢!

试了一下,对于规则数据可行。

如果 当某个参数后面的值为空时 (第二行 Sortid=)
如: pid=105&type=2&Sortid=

输出结果为:
pid 100 type 1 - - - - - - - - - -
pid 105 type 2 srotid pid=105&type=2&Sortid= - - - - - - - -
- - - - srotid 3 Themeid 1002 offid 102 - - - -
- - - - srotid 4 Themeid 1002 offid 102 page 1 - -
pid 101 - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - - srotid 3 Themeid 1002 offid 102 page 2 from jdk
- - - - - - - - - - - - - -

会有点问题。

呵呵, 我试试修改一下你的脚本。

论坛徽章:
0
4 [报告]
发表于 2008-03-26 10:06 |只看该作者
原帖由 cbs20 于 2008-3-25 18:01 发表
多谢!

试了一下,对于规则数据可行。

如果 当某个参数后面的值为空时 (第二行 Sortid=)
如: pid=105&type=2&Sortid=

输出结果为:
pid 100 type 1 - - - - - - - - - -
pid 105 type 2 srotid  ...


用"="后面的 大写字母  做判断应该没有问题吧
具体取决于你的 文件内容

论坛徽章:
0
5 [报告]
发表于 2008-03-26 10:55 |只看该作者
BEGIN{
FS="&"
}
if(NF>0)
{
        a=""
        if ($1~/pid=/){a=a"pid "gensub(/.*pid=([^&]+).*/,"\\1",1,x)}else{a=a"- -"}
        if ($2~/type=/){a=a" type "gensub(/.*type=([^&]+).*/,"\\1",1,x)}else{a=a" - -"}
        if ($3~/Sortid=/){a=a" srotid "gensub(/.*Sortid=([^&]+).*/,"\\1",1,x)}else{a=a" - -"}
        if ($4~/Themeid=/){a=a" Themeid "gensub(/.*Themeid=([^&]+).*/,"\\1",1,x)}else{a=a" - -"}
        if ($5~/offid=/){a=a" offid "gensub(/.*offid=([^&]+).*/,"\\1",1,x)}else{a=a" - -"}
        if ($6~/page=/){a=a" page "gensub(/.*page=([^&]+).*/,"\\1",1,x)}else{a=a" - -"}
        if ($7~/from=/){a=a" from "gensub(/.*from=([^&]+).*/,"\\1",1,x)}else{a=a" - -"}
        print a
} else
{print $0}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP