awk或sed来解析日志文件中的数据

时间:2015-06-26 19:27:45

标签: logging awk sed

来自我的某个应用程序的选项卡分隔日志记录如下所示:

Time UserId CustomField CityId
2015-06-16-12:36:39 _v0YurN20wyj5h5QNIfoKA st=prefooter300x253;aa=855677;aam=91363629792766391842337900189790343745;kw=4onews;kw=5vo1bw;kw=671l7s;sqt=4 1023191
2015-06-16-12:00:08 7ovC6FHLKjMxJpiZHvlDGQ st=xrailtop300x250;aam=86662686616919269952594761014252363053;kw=240000;kw=240001;kw=240002;kw=240003;kw=240004;kw=240005;kw=240006;kw=240007;kw=240008;px=240002;px=240003;sov=4;sqt=4 1028057
2015-06-16-12:04:41 ZBV9KBZjMmkOcst7j2r8wA st=yrailtop300x250;aam=67657135077785797411906987077419372156;kw=top_of_the_rock_news;rfsh=0;sov=14;sqt=9 1025202
2015-06-16-13:05:42 ABf9KBZjMmkOcst7j2r8w4 st=yrailtop300x250;aam=95657135077785797411906987077419372142;kw=liquid_cow_found_on_Mars;kw=2305;kw=stars_don't_care_about_astronomy;rfsh=0;sov=14;sqt=9 1025202
2015-06-16-13:05:42 1tf9KBZjMmkOcst7j2r8y2 st=yrailtop300x250;kw=liquid_cow_found_on_Mars;rfsh=0;sov=14;sqt=9 1025202

我需要在摄取到数据库之前使用awk进行预处理。想要只保留Time,UserID以及CustomField的部分内容(总是" aam"当存在时的值," kw"仅当字符串超过16个字符时才值) 。我可以省略kw部分或稍后处理它。

编辑:所需的输出看起来像这样

Time    UserId  RecordNo    NewsItem1    NewsItem2
2015-06-16-12:36:39 _v0YurN20wyj5h5QNIfoKA  aam=91363629792766391842337900189790343745  NA  NA
2015-06-16-12:00:08 7ovC6FHLKjMxJpiZHvlDGQ  aam=86662686616919269952594761014252363053  NA  NA
2015-06-16-12:04:41 ZBV9KBZjMmkOcst7j2r8wA  aam=67657135077785797411906987077419372156  kw=top_of_the_rock_news
2015-06-16-13:05:42 ABf9KBZjMmkOcst7j2r8w4  aam=95657135077785797411906987077419372142  kw=liquid_cow_found_on_Mars kw=stars_don't_care_about_astronomy 
2015-06-16-13:05:42 1tf9KBZjMmkOcst7j2r8y2  NA  kw=liquid_cow_found_on_Mars NA

Edit2:我接受了答案。根据Ed的建议,我添加了两个原始帖子中没有的记录,包括异常记录(没有aam值或多个合法的kw值)。如果找到多个kw值,只有前两个将保留在NewsItem1和NewsItem2中,其余的将被忽略

1 个答案:

答案 0 :(得分:2)

$ cat tst.awk         
BEGIN { FS=OFS="\t" }
{
    if (NR==1) {
        aam = "RecordNo"
        kw  = "NewsItem"
    }
    else {
        aam = kw = "NA"
        split($3,a,/;/)
        for (i=1; i in a; i++) {
            if (a[i] ~ /^aam/) {
                aam = a[i]
            }
            if ( (a[i] ~ /^kw/) && (length(a[i])>16) ) {
                kw = a[i]
            }
        }
    }
    print $1, $2, aam, kw
}

$ awk -f tst.awk file
Time    UserId  RecordNo        NewsItem
2015-06-16-12:36:39     _v0YurN20wyj5h5QNIfoKA  aam=91363629792766391842337900189790343745      NA
2015-06-16-12:00:08     7ovC6FHLKjMxJpiZHvlDGQ  aam=86662686616919269952594761014252363053      NA
2015-06-16-12:04:41     ZBV9KBZjMmkOcst7j2r8wA  aam=67657135077785797411906987077419372156      kw=top_of_the_rock_news

如果存在超过16个字符的多个kw值,或者如果没有aam,您没有说出或想要显示您想要发生什么。如果其中任何一种情况发生,请编辑问题中的样本输入/输出以显示它。