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