我有一个大的日志文件,其中包含用于特定任务的行,如下所示:
[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。两者中的哪个命令正确(如果有)?而我理想情况下应该做什么?
答案 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)
问题:
uniq
和sort -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
中唯一编号的数字