Tente isso
sort macadd | uniq -c
Eu tenho um arquivo com endereços MAC (1 / line com: as separador, classificado) e preciso descobrir quantas vezes cada um desses endereços MAC aparece no arquivo. Eu modifiquei isto:
... um pouco para conseguir isso:
#!/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
Que produz esta saída:
$ ./test.sh
12 00
84 08
6 09
36 0A
84 0B
1415 0C
4 10
6 12
68 13
... o que obviamente não é o que estou procurando. Quando eu removo: do arquivo de origem, recebo isso:
6 00EEBDA24AE1
3 10AE605A727A
6 2847AAC81C88
2 34C059B368DC
10 4C3C1655CD6A
1415 4C7F62310CD0
1 50CCF8BA10D7
... o que me dá o que eu quero, mas gostaria de manter o: separador por vários motivos. Também seria bom ter a largura do padrão da primeira coluna para produzir uma saída de tabela:
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
Para onde ir a partir daqui?
Obrigado antecipadamente.
Tudo que você precisa é sort macadd | uniq -c
, como explicado por @roaima, mas eu só queria mostrar como você poderia fazer isso usando a mesma abordagem que você tentou.
Não há motivo para grep
através do arquivo, você pode apenas alimentá-lo diretamente para while
:
while read mac; do echo "$mac"; done < macadd
Além disso, grep
tem uma opção -c
que conta as correspondências. Assim, com alguns pequenos ajustes, você pode fazer o que estava tentando usar as ferramentas que estava usando:
$ 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
Agora, seu grep
falhou porque :
não é considerado um caractere de palavra, portanto, não corresponde a \w
. Você poderia ter usado algo assim:
grep -ohE '[A-Z0-9:]+' macadd | sort -u
Mas não há necessidade de grep
, pois sort
pode fazer isso sozinho (sempre supondo que seu arquivo não tenha nada além de endereços MAC):
sort -u macadd | while read . . .
Tags grep wc shell-script