grep com contagem de padrões individuais

2

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:

Como contar ocorrências de todas as palavras em todos os arquivos de um diretório usando o grep? Mas com contagem incrementada apenas uma vez por palavra por arquivo

... 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.

    
por Peregrino69 31.03.2015 / 01:34

2 respostas

1

Tente isso

sort macadd | uniq -c
    
por 31.03.2015 / 01:43
2

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 . . .
    
por 31.03.2015 / 02:03