Shell脚本 增强grep 查找函数所在的文件(只在*.o)

本文介绍了一种在大型源码库中高效查找特定函数的方法,通过自定义的grep.sh脚本,仅在已编译的文件中搜索,显著提高了搜索效率。以uboot项目为例,展示了如何从众多文件中快速定位到目标函数,相较于传统vim+gtags方法,结果更精准,范围更小。

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

在大型源码中,查找函数名确实有点头疼,如在 kernel/uboot 中,同样的函数名可能在多个文件中定义.

本脚本实现只在已编译的文件中查找关键字(含有*.o)

本脚本包含git grep命令, 假设是在git仓库下使用.

 

脚本

编写grep.sh如下:

#!/bin/sh
#Verson:1.0
#Auther:Jojo

if [ ! $1 ]; then
    echo "Usage:./grep.sh function_name"
    exit
fi

keyword=$1
ret=`git grep $keyword | awk -F ":" '{print $1}' | awk -F "." '{print $1".o"}'`
ret=`ls $ret 2> /dev/null | uniq | awk -F "." '{print $1".*"}'`
git grep -n $keyword  $ret

 

使用技巧

假如我要在uboot下查找board_init_f,使用vim+gtags

结果发现它在超过20个以上的文件中出现

   1    168  ../arm926ejs/mxs/spl_boot.c <<board_init_f>>
             inline void board_init_f(unsigned long bootflag)
   2    279  am33xx/board.c <<board_init_f>>
             void board_init_f(ulong dummy)
   3     21  armada-xp/spl.c <<board_init_f>>
             void board_init_f(ulong dummy)
   4    286  exynos/spl_boot.c <<board_init_f>>
             void board_init_f(unsigned long bootflag)
   5    134  omap-common/hwinit-common.c <<board_init_f>>
             void board_init_f(ulong dummy)
   6    264  omap3/board.c <<board_init_f>>
             void board_init_f(ulong dummy)
   7    151  sunxi/board.c <<board_init_f>>
             void board_init_f(ulong dummy)
   8     16  zynq/spl.c <<board_init_f>>
             void board_init_f(ulong dummy)
   9    252  ../../lib/board.c <<board_init_f>>
             void board_init_f(ulong bootflag)
  10     33  ../../lib/spl.c <<board_init_f>>
             void __weak board_init_f(ulong dummy)
  11     78  ../../mach-at91/spl_at91.c <<board_init_f>>
             void board_init_f(ulong dummy)
  12     78  ../../mach-at91/spl_atmel.c <<board_init_f>>
             void board_init_f(ulong dummy)
  13     82  ../../../avr32/lib/board.c <<board_init_f>>
             void board_init_f(ulong board_type)
  14    172  ../../../nds32/lib/board.c <<board_init_f>>
             void board_init_f(ulong bootflag)
  15     28  ../../../powerpc/cpu/mpc5xxx/spl_boot.c <<board_init_f>>
             void board_init_f(ulong bootflag)
  16     23  ../../../powerpc/cpu/ppc4xx/spl_boot.c <<board_init_f>>
             void board_init_f(ulong bootflag)
  17    338  ../../../powerpc/lib/board.c <<board_init_f>>
             void board_init_f(ulong bootflag)
  18    149  ../../../sparc/lib/board.c <<board_init_f>>
             void board_init_f(ulong bootflag)
  19    236  ../../../../board/armadeus/apf27/apf27.c <<board_init_f>>
             void board_init_f(ulong bootflag)
  20    136  ../../../../board/bachmann/ot1200/ot1200_spl.c <<board_init_f>>
             void board_init_f(ulong dummy)
-- More --

 我们使用脚本,只在已经编译了的文件中查找:

./grep.sh "board_init_f("
arch/arm/cpu/armv7/lowlevel_init.S:54:   * this init in the SPL board_init_f() function which is called
arch/arm/lib/crt0.S:20: * 1. Set up initial environment for calling board_init_f().
arch/arm/lib/crt0.S:27: * 2. Call board_init_f(). This function prepares the hardware for
arch/arm/lib/crt0.S:29: *    be available yet, , board_init_f() must use the current GD to
arch/arm/lib/crt0.S:37: *    ones allocated by board_init_f() in system RAM, but BSS and
arch/arm/lib/crt0.S:42: *    board_init_f().
arch/arm/lib/crt0.S:47: *    RAM. GD has retained values set by board_init_f(). Some CPUs
arch/arm/lib/crt0.S:61: * Set up initial C runtime environment and call board_init_f(0).
arch/arm/lib/crt0.S:86: bl      board_init_f                                                                                            
common/board_f.c:780:/* Record the board_init_f() bootstage (after arch_cpu_init()) */
common/board_f.c:1011:void board_init_f(ulong boot_flags)

范围一下缩小到两个文件. 结果一目了然.

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值