首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >awk +过滤器日志文件

问awk +过滤器日志文件
EN

Stack Overflow用户
提问于 2014-06-02 17:52:35
回答 4查看 1.2K关注 0票数 3

为了过滤重复的行,我使用了下面的好的awk命令

示例:

代码语言:javascript
复制
cat LogFile | awk '!seen[$0]++'

问题是,在某些情况下,我们需要过滤重复行,尽管有些字段是不同的,而且它们并不那么重要。

例如

LogFile:

代码语言:javascript
复制
 [INFO],[02/Jun/2014-19:30:45],EXE,ds1a,INHT VERION , 1.4.4.3-08
 [INFO],[02/Jun/2014-19:31:25],EXE,ds1a,INHT VERION , 1.4.4.3-08
 [INFO],[02/Jun/2014-19:32:40],EXE,ds1a,INHT VERION , 1.4.4.3-08

请看一下这个文件- LogFile

我需要删除第三个分隔符",“中的重复行,直到行尾,

不管第三个定界符之前是什么

最后,我应该得到这个过滤过的文件:(应该总是列表中的第一个文件)

代码语言:javascript
复制
    [INFO],[02/Jun/2014-19:30:45],EXE,ds1a,INHT VERION , 1.4.4.3-08

所以请帮我完成我的任务

如何从第三个分隔符",“中过滤,而忽略字段:INFO、.、EXE、

注-插入也可以与perl一行

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-06-02 18:00:03

使用GNU awk for gensub():

代码语言:javascript
复制
$ awk '!seen[gensub(/([^,]*,){3}/,"","")]++' file
[INFO],[02/Jun/2014-19:30:45],EXE,ds1a,INHT VERION , 1.4.4.3-08

支持RE间隔的任何awk (最现代的awk):

代码语言:javascript
复制
$ awk '{key=$0; sub(/([^,]*,){3}/,"",key)} !seen[key]++' file
[INFO],[02/Jun/2014-19:30:45],EXE,ds1a,INHT VERION , 1.4.4.3-08
票数 4
EN

Stack Overflow用户

发布于 2014-06-02 18:13:12

使用perl一行程序:

代码语言:javascript
复制
perl -lne '$k = s/(.*?,){3}//r; print if !$seen{$k}++' file.log

产出:

代码语言:javascript
复制
[INFO],[02/Jun/2014-19:30:45],EXE,ds1a,INHT VERION , 1.4.4.3-08

解释:

交换机:

  • -l:启用行结束处理。(只有当日志文件的最后一行缺少新行时才需要)
  • -n:为输入文件中的每一行创建一个while(<>){..}循环。
  • -e:告诉perl在命令行上执行代码。

码

  • $k = s/(.*?,){3}//r:在变量$k中的第三个逗号之后保存所有内容
  • print if !$seen{$k}++:如果前面没有看到键,就打印这一行。
票数 2
EN

Stack Overflow用户

发布于 2014-06-02 18:52:00

使用autosplit的方式略有不同:

代码语言:javascript
复制
perl -aF, -ne'print unless $seen{"@F[3..$#F]"}++' logfile.txt
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24000436

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档