在阅读代码,尤其是较为复杂的工程时,我经常需要在整个工程下查找某个变量、类或函数。从而明确他们何时被赋值、读取,与其他类有什么关系以及何时被调用等。这样,便于我们理解工程的结构、程序执行的流程。我们可以利用Shell指令在某个目录下查找所有文件是否包含某字符串或匹配某模式。
例:$ find ./ -name "*.cpp" | xargs grep 'abc'
上述指令会在当前目录下递归的找到所有文件名的后缀为'.cpp'的文件,并在每个文件中逐行查找是否包含字符串'abc'。我们也可以利用正则表达式查找文件中是否包含某种模式,顺便输出行号。
例:$ find ./ -name "*" | grep '.cpp$\|.h$' | xargs grep -n '\babc\b'
上述指令在当前目录下递归的找到以‘.cpp’或‘.h’为后缀的文件,并在找到的文件中逐行地查找是否有单独的‘abc’出现。
下面为实际输出例子。
$ find ./ -name "*" | grep '.cpp$\|.h$'| xargs grep -n HandoverProcedure
./device/UserEquipment.cpp:226: NetworkManager::Init()->HandoverProcedure(time, this, targetNode, newTagertNode);
./componentManagers/NetworkManager.cpp:637: HandoverProcedure(time, record, targetNode, newTagertNode);
./componentManagers/NetworkManager.cpp:768:NetworkManager::HandoverProcedure(double time, UserEquipment* ue, NetworkNode* oldTarget, NetworkNode* newTarget)
./componentManagers/NetworkManager.cpp:771: std::cout << "** HO ** \t HandoverProcedure for user "
./componentManagers/NetworkManager.h:149: HandoverProcedure (double time, UserEquipment* ue, NetworkNode* oldTarget, NetworkNode* newTarget);
注:
1.Shell中,通配符与正则表达式不同。find -name 后面只能跟通配符 find -regex 与 grep 后可以跟正则表达式。
2.正则表达式中 ‘|’ 表示匹配 ‘|’ 前面或后面的模式 ‘( )’ 可以限制 ‘|’ 的范围。'$' 表示匹配末尾。
3.xargs 可以读入stdin,并以空格、换行的字符为界把stdin内容分解为若干个参数传给管道后的指令。可以参考http://czmmiao.iteye.com/blog/1949225