Linux下完美使用find+grep实现全局代码搜索

  作者:zhanhailiang 日期:2014-10-11

背景

在Window下有大量方便的图形化工具可以实现全局搜索,但是Linux服务器中由于使用命令行操作导致全局搜索是一个比较高的门槛。

第一种方法

首先,举个最简单的例子,在阅读代码过程中我们经常需要查看某个函数的定义,但是一般开源项目代码规模都相当庞大,此时你就可以如下使用find+grep轻松查找到该函数的定义,譬如,我想在php源码中搜索is_array方法的定义,如下:

[[email protected] standard]# find . -name ‘*.c‘ -exec grep -Hna ‘is_array‘ {} \;
./basic_functions.c:2540:ZEND_BEGIN_ARG_INFO(arginfo_is_array, 0)
./basic_functions.c:3049:	PHP_FE(is_array,														arginfo_is_array)
./type.c:283:/* {{{ proto bool is_array(mixed var)
./type.c:285:PHP_FUNCTION(is_array)

这里需要注意两点: 1. find使用-exec时“;”是必备参数,如下两种方法都会导致“find: missing argument to `-exec‘”,其中第一个命令报错是因为确实缺少“;”,而第二个命令报错是因为在shell中执行语句时“;”被认为是结束符,而不是-exec的参数,故使用时必须对其进行转义。

[[email protected] standard]# find . -name ‘*.c‘ -exec grep -Hna ‘is_array‘ {}
find: missing argument to `-exec‘
[[email protected] standard]# find . -name ‘*.c‘ -exec grep -Hna ‘is_array‘ {} ;
find: missing argument to `-exec‘
[[email protected] standard]# find --help
 
actions: -delete -print0 -printf FORMAT -fprintf FILE FORMAT -print
      -fprint0 FILE -fprint FILE -ls -fls FILE -prune -quit
      -exec COMMAND ; -exec COMMAND {} + -ok COMMAND ;
      -execdir COMMAND ; -execdir COMMAND {} + -okdir COMMAND ;

2. 如上例,笔者在使用grep时添加了-Hna,其分别输出文件路径,行号,及相应的文本内容:

[[email protected] standard]# grep --help
 
  -n, --line-number         print line number with output lines
      --line-buffered       flush output on every line
  -H, --with-filename       print the filename for each match
  -a, --text                equivalent to --binary-files=text

第二种方法

如果针对查看项目查看源码的需求,那么在服务器上安装配置好ctags工具来配合vim,将是完美方案,请参考《Sublime
Text 2安装Ctags插件
》相似原理在Linux上安装配置即可,强烈技术流的同学使用该方法。

时间: 2024-12-30 03:02:16

Linux下完美使用find+grep实现全局代码搜索的相关文章

Linux下获取本机IP地址的代码

Linux下获取本机IP地址的代码,返回值即为互联网标准点分格式的字符串. #define ETH_NAME "eth0" //获得本机IP地址 char* GetLocalAddress() { int sock; struct sockaddr_in sin; struct ifreq ifr; sock = socket(AF_INET, SOCK_DGRAM, 0); if (sock == -1) { perror("socket"); return NU

分享Linux下完美的Sublime Text解决方案

在linux下使用Sublime,最棘手的问题就是中文输入法的支持太差,我这里找到了一款已经被打好中文输入补丁的Sublime,在这里分享给大家: [Sublime Text 3065中文64位] 我分析了一下Sublime的中文补丁的用法,首先是Sublime开发团队发布的多语言补丁,可以编译为.so文件,然后使用linux下的LD_PRELOAD环境变量,将整个so文件预加载到sublime进程空间中. LD_PRELOAD=/usr/lib/sublime_text_3/sublime_t

Guake Terminal ── linux下完美帅气的终端

虽说现在很多Linux发行版,比如Ubuntu,已经基本上可以采用GUI来完成绝大部分一般性的任务.但是,终端程序对于linux用户来说仍是必不可少的. Gnome自带的gnome-terminal还算不错,简单,易用,也已经支持多标签.但是,如果你希望让终端自动启动并在后台运行,如果你喜欢更快速地隐藏和显示终端,如果你更习惯使用快捷键,那么Guake 绝对是一个更好的选择. 前面有一篇文章(http://blog.csdn.net/u013634961/article/details/3953

linux下C语言编程,include的默认搜索路径

C语言编程时,发现细节的魅力很大.较为详细了看了一下关于include的知识,发现了几点新知: 1.include<头文件名>和include"头文件名" 如:include<stdio.h>和include"stdio.h" 前者(使用<>),来引用stdio.h文件,是首先检索标准路径,看看这些文件夹下是否有该头文件:如果没有,也不会检索当前文件所在路径,并将报错. 后者(使用""),来引用stdio.h文

Linux使用技巧——find结合grep模糊匹配文件搜索关键字

find结合grep模糊匹配文件搜索关键字 不知道哪个单词在哪个文件里面可以使用这种方法 [[email protected] window_books]# find . -name "*txt" -type f | xargs grep "description" ./2013_liuyinan_5500_words_21-32.txt:1309 description ?????????????? n. 描写,形容:种类 ion-名词后缀 ./2013_liuy

linux下用sed和grep命令替换目录下所有文件中的字符串

试例如下: 第三条命令是将当前目录下代码中所有的"arm-none-linux-gnueabi" 替换成 "arm-linux" sed -i 's/arm-none-linux-gnueabi-g++/arm-linux-g++\ -O2\ -I\$\(INC\)\ -I\$\(INCSYS\)\ -static/g' `grep arm-none-linux-gnueabi-g++ . -rl` sed -i 's/arm-none-linux-gnueabi-

linux下使用find xargs grep查找文件及文件内容

1,在某个路径下查文件. 在/etc下查找“*.log”的文件 find /etc -name “*.log” 2,扩展,列出某个路径下所有文件,包括子目录. find /etc -name “*” 3,在某个路径下查找所有包含“hello abcserver”字符串的文件. find /etc -name “*” | xargs grep “hello abcserver” 或者find /etc -name “*” | xargs grep “hello abcserver” > ./cqt

Linux下的PS和grep的使用

ps-process status ps用来查看进程,PS的参数非常多. 格式:ps [options] PS -A 列出所用的进程 PS -aux 显示所有包含其他使用者的进程 PS -axi 列出所有的精灵进程 grep——Goobal Regular Expr ession Print,表示全局正则表达式版本. 格式: grep 查找内容 [options] options负责限定查找的方式 一般都是grep和ps一块用,比如查找一个特定进程 ps -aux | grep test,查找进

Python在Linux下的Tab补齐(附代码)

如果经常在linux的命令行下面调试python程序,对于用惯了Pycharm的人来说,是非常的痛苦啊,没有tab补全,还要自己一个一个的敲,多么痛的领悟,现在好了,有了这个脚本,命令行模式下也能tab补全了,走起! 1   vi /root/.pythonstartup #!/usr/bin/env python # -*- coding:utf-8 -*- import sys import readline import rlcompleter import atexit import o