Use apenas awk
(usando grep
parece redundante para mim, pois awk
já pode corresponder a uma expressão regular):
awk '$0~/\s*\#define\s*\[.*\]\s*.*/ {print $3}' *.h
Percorrendo a expressão com mais detalhes:
$0 ~ /regexp/ # look for the regular expression in the record
\s* # whitespace, any number of times
\#define # literal string, '#' has to be scaped
\s* # same as above
.* # any character, any number of times, this is
# your hex code and you can refine the regex here
{ print $3 } # print the third field if the record matches
Para que isso seja executado recursivamente, por exemplo,
mkdir -p a/b/c
echo " #define [name] 0x0001" > a/a.h
echo " #define [name] 0x0002" > a/b/b.h
echo " #define [name] 0x0003" > a/b/c/c.h
tree
.
└── a
├── a.h
└── b
├── b.h
└── c
└── c.h
3 directories, 3 files
como awk
precisa receber uma lista de arquivos para operar, você pode:
find . -type f -name "*.h" \
-exec awk '$0~/\s*\#define\s*\[.*\]\s*.*/ {print $3}' {} \;
0x0002
0x0003
0x0001