为什么这两个 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
打印唯一编号
我有一个很大的日志文件,其中包含以下特定任务的行:
[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
andsort -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
打印唯一编号