【问题标题】:Why do these two GREP commands give different results?为什么这两个 GREP 命令给出不同的结果?
【发布时间】:2019-09-23 11:03:17
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

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

标签: sorting grep uniq wc


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    问题: uniqsort -u

    它们在简单的情况下应该是等价的,但会表现得很好 如果您使用 -k 选项仅定义某些 输入行的字段用作排序键。在这种情况下,sort -u 将抑制具有相同键的行,即使其他部分 行不同,而 uniq 只会抑制完全符合的行 相同

    **两个命令的区别**

    第一个命令grep 'My Task :' | uniq | wc -l:打印计数 '我的任务'独有的行数

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

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

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

    【讨论】:

      【解决方案3】:

      不需要多个命令来计算唯一的数字。

      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(第一次找到),则使用 1 递增 c,否则添加 0
      • {print c} 打印变量 c 中唯一编号的编号

      【讨论】: