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

Why do these two GREP commands give different results?

我有一个很大的日志文件,其中包含以下特定任务的行:

[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。如果有的话,这两个命令中的哪一个是正确的?理想情况下我应该做什么?

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

Problem: uniq and sort -u

They should be equivalent in the simple case, but will behave differently if you're using the -k option to define only certain fields of the input line to use as sort keys. In that case, sort -u will suppress lines which have the same key even if other parts of the line differ, whereas uniq will only suppress lines that are exactly identical.

**两个命令的区别**

1st Command grep 'My Task :' | uniq | wc -l: It prints the count of lines which are unique for 'My Task'

2nd Command grep -E 'My Task :' | sort --unique | grep -cE 'My Task' : It prints the count of matching pattern 'My Task'

两者不一致b/w要看你日志文件的内容了。

要回答您使用哪一个的问题: 当像你那样使用 grep with -E 时,尝试制作一个合适的模式,然后计算行数。

不需要多个命令来计算唯一编号。

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
  • 打印唯一编号