Awk 如何跟踪大型日志文件中没有';是否按预期顺序显示?

Awk 如何跟踪大型日志文件中没有';是否按预期顺序显示?,awk,sed,grep,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的行没有按预期顺序出现。如何做到这一点,使用grep,sed和awk?我只是在我的iPad上,没有办法测

我有一个很大的日志文件,其中包括以下格式的行

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的行没有按预期顺序出现。如何做到这一点,使用
grep
sed
awk

我只是在我的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
awk'BEGIN{for(i=0;i这适用于我:

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
仅批处理(最后一次排序不是必需的)


有多少id?间隙是否构成“无序”-我的意思是1A、1C、1D、1E正常或无序?消息类型是否真的,字面上是A、B、C?或更复杂?至少有10000个id号,但可能更多。类型是A、B和C,与我上面描述的完全相同。不存在间隙,只有意外的消息顺序。
sort -k1n YourFile | tee file1 | sort -k2 > file2 && comm -23 file1 file2 | sort