如何跟踪大型日志文件中没有按预期顺序出现的行?

时间:2014-10-18 17:57:49

标签: awk sed grep

我有一个大型日志文件,其中包含格式为

的行
id_number message_type

以下是日志文件的示例,其中所有行都按预期顺序显示

1 A
2 A
1 B
1 C
2 B
2 C

但是,并非所有行都出现在我的日志文件中的预期顺序中,并且我想获得未按预期顺序出现的所有ID号的列表。对于以下文件

1 A
2 A
1 C
1 B
2 B
2 C

我想得到一个输出,表明id号1的行没有出现在预期的顺序中。如何使用grepsedawk

执行此操作

3 个答案:

答案 0 :(得分:1)

我只能在我的iPad上无法测试这个,但我可以告诉你如何使用awk来解决这个问题,因为没有其他人在回答......

这样的事情:

awk 'BEGIN{for(i=0;i<10000;i++)expected[i]=ord("A")}
     {if(expected[$1]!=ord($2))
         print "Out of order at line ", NR, $0;
      expected[i]=ord($2)+1
     }' yourFile

您需要粘贴hereord()功能。

基本上,概念是初始化一个名为expected[]的数组,该数组跟踪每个id所期望的下一个消息类型,然后,在读取每一行时,检查它是下一个预期值

答案 1 :(得分:1)

这对我有用:

awk -v "a=ABC" 'substr(a, b[$1]++ + 1, 1) != $2 {print $1}' logfile

运行此操作时,将打印每个无序行的ID号。如果没有乱序线,则不打印任何内容。

如何运作

  • -v "a=ABC"

    这将变量a定义为具有预期顺序的字符列表。

  • substr(a, b[$1]++ + 1, 1) != $2 {print $1}

    对于每个ID号,数组b会跟踪我们的位置。最初,b对于所有ID都为零。使用此初始值(即b[$1]==0),表达式substr(a, b[$1] + 1, 1)将返回A,这是我们的第一个预期输出。因此,条件substr(a, b[$1] + 1, 1) != $2检查来自substr函数的预期输出是否与第二个字段$2中显示的实际输出不同。如果确实不同,则会打印ID值$1

    计算substr表达式后,表达式++中的尾随b[$1]++会将b[$1]的值增加1,以使b[$1]的值增加准备好在下次遇到ID $1时。

细化

每次遇到无序行时,上面都会打印一个ID号。如果您只想打印一次而不是多次打印坏ID,请使用:

awk -v "a=ABC" 'substr(a, b[$1]++ + 1, 1) != $2 {bad[$1]++} END{for (n in bad) print n}'  logfile

答案 2 :(得分:1)

仅限批次(最后一种排序不是强制性的)

sort -k1n YourFile | tee file1 | sort -k2 > file2 && comm -23 file1 file2 | sort