为什么这两个GREP命令给出不同的结果?

时间:2019-09-23 11:03:17

标签: sorting grep uniq wc

我有一个大的日志文件,其中包含用于特定任务的行,如下所示:

[info] My task : 123
[info] Other task : 111
[info] My task : 456
[info] My task : 456
[info] My task : 789

我想计算记录的唯一"My task"的数量。在这种情况下应该是3。

我使用了这两个命令,我认为它们应该给出相同且正确的结果:

grep 'My Task :' | uniq | wc -l
grep -E 'My Task :' | sort --unique | grep -cE 'My Task :'

这两个命令在我创建的小型测试文件上给出相同的结果,但是在服务器上的大型日志文件上给出不同的结果。我不明白为什么。确切地说,第一个命令计数为〜33k,第二个命令计数为〜15k。两者中的哪个命令正确(如果有)?而我理想情况下应该做什么?

3 个答案:

答案 0 :(得分:2)

有可能因为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

答案 1 :(得分:0)

  

问题uniqsort -u

     

在简单情况下,它们应该等效,但是会表现   如果您使用-k选项仅定义某些   输入行的字段用作排序键。在这种情况下,对-u进行排序   会取消具有相同键的行,即使   行是不同的,而 uniq只会隐藏完全相同的行   相同

**两个命令之间的区别**

  

第一个命令grep 'My Task :' | uniq | wc -l:打印计数   对于“我的任务”而言是唯一的行

     

第二个命令grep -E 'My Task :' | sort --unique | grep -cE 'My Task':打印匹配模式“我的任务”的计数

两者的差异取决于日志文件的内容。

要回答您要使用的问题: 像您一样使用grep with -E时,您确实尝试制作了合适的图案,然后计算行数。

答案 2 :(得分:0)

无需多个命令即可计算唯一编号。

awk '/My task/ {a[$NF]++;c+=a[$NF]==1?1:0} END {print c}' file
3
  • /My task/的行是否包含My task(如果是)
    • a[$NF]++创建一个以数字为键的数组。第一次找到一个值将是1,第二次找到2,第三次找到一个相同值将是3,等等
    • c+=a[$NF]==1?1:0如果数组a [number]为1(首次发现),则将c加上1,否则添加0
  • {print c}打印变量c中唯一编号的数字