我有一个包含 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