免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: redir
打印 上一主题 下一主题

[文本处理] 请教各位大侠一个换行的问题 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2012-08-31 09:55 |只看该作者
$9取日志里面的内容,比如请求内容里面的uid,还有$10,取name之类的

论坛徽章:
15
2015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-15 17:29:44午马
日期:2015-01-06 17:06:51子鼠
日期:2014-11-24 10:11:13寅虎
日期:2014-08-18 07:10:55酉鸡
日期:2014-04-02 12:24:51双子座
日期:2014-04-02 12:19:44天秤座
日期:2014-03-17 11:43:36亥猪
日期:2014-03-13 08:13:51未羊
日期:2014-03-11 12:42:03白羊座
日期:2013-11-20 10:15:18CU大牛徽章
日期:2013-04-17 11:48:45
12 [报告]
发表于 2012-08-31 10:06 |只看该作者
awk 里,条件一条一条的加, 你自己试一下啦。

论坛徽章:
0
13 [报告]
发表于 2012-08-31 10:27 |只看该作者
求rdcwayx大大指点

awk '{if ($8!="-") {print $1, $2 ,$8} else {print $1,$2}}' OFS="," test
日志如下:

13:46:07 127.0.0.1 GET /test testsets 80 - 127.0.0.1 asdfasdfadfadfasdf123123123username123123123123uid=asd1;asdfasdfasdfemail=123123123@123.com;asdfasdfasdfasdf 200 0 0 1823 1147 31

如上如何在一行取出uid和email呢?感激不尽!

论坛徽章:
15
2015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-15 17:29:44午马
日期:2015-01-06 17:06:51子鼠
日期:2014-11-24 10:11:13寅虎
日期:2014-08-18 07:10:55酉鸡
日期:2014-04-02 12:24:51双子座
日期:2014-04-02 12:19:44天秤座
日期:2014-03-17 11:43:36亥猪
日期:2014-03-13 08:13:51未羊
日期:2014-03-11 12:42:03白羊座
日期:2013-11-20 10:15:18CU大牛徽章
日期:2013-04-17 11:48:45
14 [报告]
发表于 2012-08-31 11:27 |只看该作者
1. 要保证第九个字段没有空格,否则命令还得调整:
2. 需要gawk 支持
  1. awk '{s=gensub(/.+uid=([^;]+);.+email=([^;]+);.+/,"\\1 \\2","g",$9);print $1,$2,$8,s}' infile

  2. 13:46:07 127.0.0.1 127.0.0.1 asd1 123123123@123.com
复制代码

论坛徽章:
0
15 [报告]
发表于 2012-08-31 12:17 |只看该作者
本帖最后由 redir 于 2012-08-31 13:09 编辑

感激rdcwayx大大,试用了下,效果可以,但是email和uid不存在的时候,把后面日志的内容也输出来了,如何判断uid不存在的话就输出email,如果email也不存在就输出none呢?谢谢。
我这样写了
  1. awk '{s=gensub(/.+uid=([^;]+);.+email=([^;]+);.+/,"\\1 \\2","g",$9);if(s~/uid/){print $1,$2,$8,s}else if(s~email){print $1,$2,$8,s}else print $1,$2,$8,"null"}' infile
复制代码
但是这样当日志文件大的时候判断起来速度好慢。

论坛徽章:
15
2015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-15 17:29:44午马
日期:2015-01-06 17:06:51子鼠
日期:2014-11-24 10:11:13寅虎
日期:2014-08-18 07:10:55酉鸡
日期:2014-04-02 12:24:51双子座
日期:2014-04-02 12:19:44天秤座
日期:2014-03-17 11:43:36亥猪
日期:2014-03-13 08:13:51未羊
日期:2014-03-11 12:42:03白羊座
日期:2013-11-20 10:15:18CU大牛徽章
日期:2013-04-17 11:48:45
16 [报告]
发表于 2012-08-31 13:18 |只看该作者
  1. awk '{ uid=($9~/uid=/)?gensub(/.+uid=([^;]+);.+/,"\\1","g",$9):"null";
  2.            email=($9~/email=/)?gensub(/.+email=([^;]+);.+/,"\\1","g",$9):"null";
  3.            print $1,$2,$8,uid,email}' infile
复制代码

论坛徽章:
0
17 [报告]
发表于 2012-08-31 13:26 |只看该作者
可以了,日志里面如果有如下:
asdfasdfadfadfasdf123123123username123123123123uid=asd1;asdfasdfasdfemail=123123123@123.com;test=test11111 asdfasdfasdfasdf 200 0 0 1823 1147 31

如何匹配出这个test11111啊?这后面是个空格。斐擦汗功能感谢rdcwayx大大不厌其烦回答。

论坛徽章:
15
2015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-15 17:29:44午马
日期:2015-01-06 17:06:51子鼠
日期:2014-11-24 10:11:13寅虎
日期:2014-08-18 07:10:55酉鸡
日期:2014-04-02 12:24:51双子座
日期:2014-04-02 12:19:44天秤座
日期:2014-03-17 11:43:36亥猪
日期:2014-03-13 08:13:51未羊
日期:2014-03-11 12:42:03白羊座
日期:2013-11-20 10:15:18CU大牛徽章
日期:2013-04-17 11:48:45
18 [报告]
发表于 2012-08-31 13:35 |只看该作者
我猜想你的$9应该是已经按照 分号 ; 分段的, 如果这样的话,命令要方便很多。但是你给的例子里已经重新改过,就找不到这个特征了。
  1. awk '{ uid=($9~/uid=/)?gensub(/.+uid=([^;]+);.+/,"\\1","g",$9):"null";
  2.     email=($9~/email=/)?gensub(/.+email=([^;]+);.+/,"\\1","g",$9):"null";
  3.     test=($9~/test=/)?gensub(/.+test=(.+)/,"\\1","g",$9):"null";
  4.            print $1,$2,$8,uid,email,test}' infile
复制代码

论坛徽章:
0
19 [报告]
发表于 2012-08-31 13:48 |只看该作者
%9里面是正常的IIS日志,都是以空格分割了,貌似这个test还会把后面的内容取出来,
查看了下,这个test字段出现的位置比较麻烦,如下:
asdfasdfadfadfasdf123123123username123123123123uid=asd1;asdfasdfasdfemail=123123123@123.com;test=test11111 asdfasdfasdfasdf 200 0 0 1823 1147 31

asdfasdfadfadfasdf123123123username123123123123uid=asd1asdfasdfasdfemail=123123123@123.com;test=test11111;asdfasdfasdfasdf 200 0 0 1823 1147 31

asdfasdfadfadfasdf123123123username123123123123uid=asd1;asdfasdfasdfemail=123123123@123.com;test=test11111&asdfasdfasdfasdf 200 0 0 1823 1147 31
asdfasdfadfadfasdf123123123username123123123123uid=asd1;asdfasdfasdfemail=123123123@123.com;asdfasdfasdfasdf  test=test11111 200 0 0 1823 1147 31

是这样乱序的,后面不是分号就是空格。这样该咋写呢

论坛徽章:
15
2015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-15 17:29:44午马
日期:2015-01-06 17:06:51子鼠
日期:2014-11-24 10:11:13寅虎
日期:2014-08-18 07:10:55酉鸡
日期:2014-04-02 12:24:51双子座
日期:2014-04-02 12:19:44天秤座
日期:2014-03-17 11:43:36亥猪
日期:2014-03-13 08:13:51未羊
日期:2014-03-11 12:42:03白羊座
日期:2013-11-20 10:15:18CU大牛徽章
日期:2013-04-17 11:48:45
20 [报告]
发表于 2012-08-31 14:38 |只看该作者
这个应该是通用的了。
  1. awk '{ uid=(/uid=/)?gensub(/.+uid=([^&; ]+)[&; ].+/,"\\1","g"):"null";
  2.     email=(/email=/)?gensub(/.+email=([^&; ]+)[^&; ].+/,"\\1","g"):"null";
  3.     test=(/test=/)?gensub(/.+test=([^&; ]+)[^&; ].+/,"\\1","g"):"null";
  4.            print $1,$2,$8,uid,email,test}' infile
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP