Usando ctags exuberantes :
$ ectags --c-kinds=d *.[ch]
ectags
é uma versão aprimorada de ctags
e etags
usada para criar um "arquivo de tags" que pode ser usado por editores como Vi / Vim ou Emacs para facilitar a navegação do código-fonte. Ele conhece as regras de gramática C, então é capaz de analisar o código C para você (para que você não precise se preocupar com expressões regulares).
Com --c-kinds=d
informamos que ectags
só se preocupa com #define
linhas no código C.
Agora você tem um arquivo chamado tags
no diretório atual com o seguinte tipo de conteúdo:
DEVELOPER bayes.h 225;" d
DIFFERENT bayes.h 227;" d
DIR_MIN bayes.h 338;" d
DNA bayes.h 242;" d
DOLLAR bayes.h 309;" d
DOLLO bayes.h 276;" d
DOWN bayes.h 215;" d
Ou seja, cada linha (exceto algumas linhas de cabeçalho) identifica o nome de uma macro, o arquivo de origem em que foi encontrado e o número da linha. Se uma macro for definida em vários arquivos, ela será listada uma vez para cada ocorrência. O último d
é um indicador de tipo de tags (todos são #define
s).
Se você quiser apenas a contagem de quantas vezes cada macro foi definida:
$ cut -f 1 tags | uniq -c