Linux Shell 在整个工程中查找字符串或匹配模式

本文介绍如何使用Shell命令在工程代码中查找特定的变量、类或函数,通过具体实例展示了如何利用find和grep命令组合来搜索指定目录下的文件并定位到含有特定字符串或符合特定模式的代码行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    在阅读代码,尤其是较为复杂的工程时,我经常需要在整个工程下查找某个变量、类或函数。从而明确他们何时被赋值、读取,与其他类有什么关系以及何时被调用等。这样,便于我们理解工程的结构、程序执行的流程。我们可以利用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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值