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
      ,以此类推
    • c+=a[$NF]==1?1:0
      如果数组a[number]是
      1
      (首次找到),则使用
      1
      增加
      c
      ,否则添加
      0
  • {print c}
    从变量
    c

如果使用
My Task
,将有0个匹配项,因为
grep
默认区分大小写。