grep 计算单个模式的数量

grep 计算单个模式的数量

我有一个包含 MAC 地址的文件(1/行,以 : 作为分隔符,已排序),我需要找出每个 MAC 地址在文件中出现的次数。我修改了这个:

如何使用grep统计目录中所有文件中所有单词的出现次数?但每个文件每个单词的计数仅增加一次

...一点点得到这个:

#!/bin/sh

grep -o -h -E '\w+' macadd | sort -u | \
while read word;
do
        # iterate through each word and find how many files it occurs
        c=`grep "$word" macadd | wc -l`
        echo "$c    $word";
done

产生以下输出:

$ ./test.sh
12    00
84    08
6    09
36    0A
84    0B
1415    0C
4    10
6    12
68    13

...这显然不是我要找的。当我从源文件中删除 : 时,我得到:

6    00EEBDA24AE1
3    10AE605A727A
6    2847AAC81C88
2    34C059B368DC
10    4C3C1655CD6A
1415    4C7F62310CD0
1    50CCF8BA10D7

...这给了我我想要的,但由于各种原因我想保留 : 分隔符。如果有第一列标准的宽度来生成表输出也很好:

6    00:EE:BD:A2:4A:E1
3    10:AE:60:5A:72:7A
6    28:47:AA:C8:1C:88
2    34:C0:59:B3:68:DC
10   4C:3C:16:55:CD:6A
1415 4C:7F:62:31:0C:D0
1    50:CC:F8:BA:10:D7

从这往哪儿走?

提前致谢。

答案1

您所需要的sort macadd | uniq -c只是@roaima 所解释的,但我只是想指出如何使用您尝试过的相同方法来做到这一点。

没有理由遍历grep该文件,您可以直接将其提供给while

while read mac; do echo "$mac"; done < macadd

此外,grep还有一个-c计算匹配的选项。因此,通过一些小的调整,您可以使用您正在使用的工具执行您尝试的操作:

$ while read mac; do 
    printf "%5s\t%s\n" $(grep -c "$mac" macadd) "$mac"; 
  done < <(sort -u macadd)
   6     00:EE:BD:A2:4A:E1
   3     10:AE:60:5A:72:7A
   6     28:47:AA:C8:1C:88
   2     34:C0:59:B3:68:DC
  10     4C:3C:16:55:CD:6A
1415     4C:7F:62:31:0C:D0
   1     50:CC:F8:BA:10:D7

现在,您grep失败了,因为:不被视为单词字符,因此与 不匹配\w。你可以使用这样的东西:

grep -ohE '[A-Z0-9:]+' macadd | sort -u 

但没有必要,grep因为sort可以自己完成(始终假设您的文件除了 MAC 地址之外什么都没有):

sort -u macadd | while read . . .

答案2

尝试这个

sort macadd | uniq -c

相关内容