如有一个文件,如下 module.h
/* Module naming conventions:
three characters prefix, plus zero or one surfix
prefix:
f file management related
o Oracle or O.S.
d data related
x expression (data standard)
z DSG invented zip, or free for commercial use zip method
surfix:
c client version of the module
r research version of the module
d deamon program
Module coding conventions:
first digit module level, 1 .. 7
second digit 7 : Oracle specific
*/
/******************************************************************************
* Module Definitions *
******************************************************************************/
#define MODULE_CFG 1 /* basic frame (STP & MSG) */
#define MODULE_ECD 2 /* encode */
#define MODULE_HSH 3 /* hash */
#define MODULE_LZM 4 /* LZ77 compress */
#define MODULE_OTS 6 /* Oracle table structure */
#define MODULE_STR 7 /* string */
#define MODULE_DIM 9 /* base data index management */
#define MODULE_DBK 10 /* like BerkeleyDB kernel */
#define MODULE_LZX 15 /* LZO real-time data compress */
#define MODULE_LZ4 16 /* LZ4 compress */
#define MODULE_FLZ 17 /* fastLZ compress */
#define MODULE_BID 20 /* block id manager */
#define MODULE_DDB 25 /* delete duplicate blocks */
#define MODULE_ODT 30 /* Oracle data type converter */
#define MODULE_ONL 40 /* Oracle National Language support */
#define MODULE_OCIW 41 /* Oracle Call Interface wrapper*/
#define MODULE_LOG 50 /* log print */
#define MODULE_DMM 60 /* dynamic memory manager */
#define MODULE_LPM 70 /* loop list manager */
#define MODULE_ZIN 100 /* zip (integer) */
#define MODULE_ZIS 101 /* zip (integer-section) */
#define MODULE_ZIP 110 /* zip (research) */
#define MODULE_ZHM 120 /* zip (huffman) */
#define MODULE_ZPK 130 /* zip (PKZIP compatible) */
#define MODULE_ZXD 140 /* zip (zip for XDT) */
#define MODULE_ZRM 150 /* zip (rowmap) */
需要提取出所有模块名,把模块名连成字符串, "cfg ecd hsh lzm ..."
awk解决方法:
awk -F'_' '/define/{print $2}' module.h | awk '/\/\*/{print tolower($1)}'
剖析:
module.h 表文件路径名
-F 是指定分割符的标志。
'_' 是分隔符 _ 需要加上‘ ’号。
/define/ 是表示出现某关键字的行,本例中关键字是define,把带有define的行抓取出来。{printf $2} 是打印以 ‘_’ 分开的第二项,如:" CFG 1 /* basic frame (STP & MSG) */ "
| 是管道输入
'\/\* 是转译字符,表 ’ /* ‘ ,就是提取带有 ‘ /* ’ 的行
tolower($1) 大写转小写
最后的输出结果是:
cfg
ecd
hsh
lzm
ots
str
dim
dbk
lzx
lz4
flz
bid
ddb
odt
onl
ociw
log
dmm
lpm
zin
zis
zip
zhm
zpk
zxd
zrm