用shell 中的grep 递归查找文件内容时不能找到正确文件的问题

最近在解决一些编译问题, 会报一些没有定义或者找不到定义的语句,要找到相关定义或者使用的文件并进行修改。 

比如提示struct roc_ie_on_ip_template没有定义的时候, 我想查找struct roc_ie_on_ip_template是在哪个文件中定义的, 于是使用了以下命令:

1. find . -type f |xargs -I  '{}' grep  -H 'roc_ie_on_ip_template' '{}'

结果确没有打印出正确的文件。

反之用:

find . -type f |xargs -I  '{}'  cat {} |grep  -H 'roc_ie_on_ip_template'  是可以打印出来的, 但是显示不了文件。

2. 为了验证grep 是不是能正常工作, 直接用grep来查看发现也不行:

grep "roc_ie_on_ip_template"   xxx.h    => 不能显示出对应的行。

cat xxx.h |grep "roc_ie_on_ip_template" => 可以显示出对应找到行。 

目前可以确认grep 工作不是正常的。 查了下资料, grep是直接打开文件查找, cat是先输出后再查找。grep会受系统相关权限的影响 。 但是我把所有文件改成777 也查找不到。于是以后我想不用grep了, 查找时为了不漏掉关键信息, 还是用cat吧。

3. 最后试验出来可靠的查找命令如下:

find . -name "*.h" | xargs -I {} sh -c ' ret=` cat "{}"|grep "roc_ie_on_ip_template" `; if [ "$ret" != "" ]; then   echo; echo "--Filename: {}"; echo "$ret"; fi '    这个只打印找到的文件。 OK

PS:

find . -name "*.h"  可以换成find . -type f 或者 find . -name *.* 根据实际需要。

xargs -I {} 是把找到的每个文件, 先缓存到{}中

sh -c 是后边用shell 脚本来解析。

ret=` cat "{}"|grep "roc_ie_on_ip_template" `; if [ "$ret" != "" ]; then   echo; echo "--Filename: {}"; echo "$ret"; fi ' 的意思是, 把每个文件用cat + grep 看下有没有要找的字符串, 有的话就把内容和文件名都打印。 如果不用if 判断 , 每个文件名都会打印, 这样就太多了。 影响美观。

grep "roc_ie_on_ip_template" 可以换成自己要找的字符串。

以上这样就不会由于环境的不同, 漏掉关键的信息了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值