最近在解决一些编译问题, 会报一些没有定义或者找不到定义的语句,要找到相关定义或者使用的文件并进行修改。
比如提示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" 可以换成自己要找的字符串。
以上这样就不会由于环境的不同, 漏掉关键的信息了。
484

被折叠的 条评论
为什么被折叠?



