Sorting 为什么这两个GREP命令给出不同的结果?
我有一个大型日志文件,其中包含特定任务的行,如下所示:Sorting 为什么这两个GREP命令给出不同的结果?,sorting,grep,uniq,wc,Sorting,Grep,Uniq,Wc,我有一个大型日志文件,其中包含特定任务的行,如下所示: [info] My task : 123 [info] Other task : 111 [info] My task : 456 [info] My task : 456 [info] My task : 789 我想计算记录的唯一“我的任务”的数量。在这种情况下应该是3 我使用了这两个命令,在我看来,这两个命令应该给出相同且正确的结果: grep 'My Task :' | uniq | wc -l grep -E 'My Task
[info] My task : 123
[info] Other task : 111
[info] My task : 456
[info] My task : 456
[info] My task : 789
我想计算记录的唯一“我的任务”
的数量。在这种情况下应该是3
我使用了这两个命令,在我看来,这两个命令应该给出相同且正确的结果:
grep 'My Task :' | uniq | wc -l
grep -E 'My Task :' | sort --unique | grep -cE 'My Task :'
这两个命令对我创建的小测试文件给出相同的结果,但对服务器上的大日志文件给出不同的结果。我不明白为什么。确切地说,第一个命令给出了~33k的计数,而第二个命令给出了~15k的计数。这两个命令中哪一个是正确的?理想情况下我应该做什么呢?这是可能的,因为uniq只能找到连续的 相同的线条。例如,如果您的文件如下所示:
[info] My task : 123
[info] Other task : 111
[info] My task : 456
[info] My task : 456
[info] My task : 789
[info] My task : 123
[info] Other task : 111
[info] My task : 456
[info] My task : 456
[info] My task : 789
[info] My task : 123
[info] Other task : 111
[info] My task : 456
[info] My task : 456
[info] My task : 789
[info] My task : 123
[info] Other task : 111
[info] My task : 456
[info] My task : 456
[info] My task : 789
[info] My task : 123
[info] Other task : 111
[info] My task : 456
[info] My task : 456
[info] My task : 789
结果将有所不同:
$ grep 'My task :' FILE | uniq | wc -l
15
$ grep -E 'My task :' FILE | sort --unique | wc -l
3
问题:uniq
和排序-u
在简单的情况下,它们应该是等价的,但会起作用
如果使用-k选项仅定义某些
用作排序键的输入行字段。在这种情况下,排序-u
将抑制具有相同键的行,即使
行不同,而uniq将仅抑制完全相同的行
完全相同
**这两个命令之间的区别**
第一个命令grep'My Task:'| uniq | wc-l
:它打印计数
“我的任务”的唯一行数
第二个命令grep-E“我的任务:”| sort--unique | grep-cE“我的任务”
:它打印匹配模式“我的任务”的计数
差异b/w两者取决于日志文件的内容。
要回答您的问题,请使用哪一个:
当使用带-E的
grep时
就像您尝试制作一个合适的模式,然后计算行数一样。无需使用多个命令来计算唯一的行数
awk '/My task/ {a[$NF]++;c+=a[$NF]==1?1:0} END {print c}' file
3
行是否包含/My task/
,如果是:我的任务
创建一个以数字为键的数组。第一次找到值时,它将是a[$NF]+
,第二次是1
,第三次找到相同的值时,它将是2
,以此类推3
如果数组a[number]是c+=a[$NF]==1?1:0
(首次找到),则使用1
增加1
,否则添加c
0
从变量{print c}
c
My Task
,将有0个匹配项,因为grep
默认区分大小写。