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

在大型源码中,查找函数名确实有点头疼,如在 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)

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

猜你喜欢

转载自blog.csdn.net/a827143452/article/details/89350057