Chinaunix首页 | 论坛 | 博客
  • 博客访问: 192672
  • 博文数量: 27
  • 博客积分: 725
  • 博客等级: 上士
  • 技术积分: 347
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-04 09:01
文章分类

全部博文(27)

文章存档

2012年(15)

2011年(12)

分类: C/C++

2012-03-27 19:03:17

在看Nginx代码的时候,经常需要在代码文件中查找一些特定的字符串,觉得系统本身自带的grep输出
格式太丑陋了,又不想去学习那么多繁琐的命令参数,干脆自己实现了一个,感觉还挺好用的。
  1. #include <apue.h>

  2. #define end(s)    ((char *) (s) + strlen(s))

  3. typedef void (*file_handler)(const char *path, void *args);

  4. char content[128];

  5. int main(int argc, char **argv)
  6. {    
  7.     int        len;
  8.     char     path[1024], *p;

  9.     assert(argc == 3);

  10.     if (chdir(argv[1]))
  11.         err_sys("chdir error");

  12.     if (getcwd(path, sizeof path) == NULL)
  13.         err_sys("getcwd error");

  14.     p = argv[2];
  15.     len = strlen(p);

  16.     if (len > 2 && *p == '"' && p[len - 1] == '"')
  17.         strncpy(content, p + 1, len - 2);
  18.     else
  19.         strncpy(content, p, len);

  20.     printf("\nSearch directory : %s for string \"%s\"\n", path, content);


  21.     dir_walk(path, grep_file, content);    

  22.     printf("\n");

  23.     return 0;
  24. }

  25. void
  26. dir_walk(const char *dname, file_handler handler, void *args)
  27. {
  28.     DIR             *dp;
  29.     struct stat      statbuf;
  30.     struct dirent     *dirp;
  31.     char             fullpath[1024];

  32.     if ((dp = opendir(dname)) == NULL)
  33.         err_sys("opendir %s error", dname);

  34.     while ((dirp = readdir(dp)) != NULL) {
  35.         if (!strcmp(dirp->d_name, ".") ||
  36.                 !strcmp(dirp->d_name, ".."))
  37.             continue;

  38.         snprintf(fullpath, sizeof fullpath, "%s/%s", dname, dirp->d_name);
  39.         
  40.         if (lstat(fullpath, &statbuf) < 0)
  41.             err_sys("lstat error");
  42.         
  43.         if (S_ISDIR(statbuf.st_mode))
  44.             dir_walk(fullpath, handler, args);
  45.         else
  46.             handler(fullpath, args);
  47.     }

  48.     closedir(dp);
  49. }


  50. static void
  51. grep_file(const char *path, void *data)
  52. {
  53.     int           fd, nline;
  54.     FILE         *fp;

  55.     char        *p, *content;
  56.     char           line[1024];
  57.     static    int     count;

  58.     content = (char *) data;

  59.     if ((fd = open(path, O_RDONLY)) < 0)
  60.         err_sys("file %s open error", path);
  61.     
  62.     if ((fp = fdopen(fd, "r")) == NULL)
  63.         err_sys("fdopen %s error", path);

  64.     nline = 0;

  65.     while (fgets(line, sizeof line, fp)) {
  66.         
  67.         nline++;

  68.         if ((p = strstr(line, content)))
  69.             printf("\n%d . %s : %d\n\t%s", ++count, path, nline, line);
  70.     }

  71.     fclose(fp);

  72.     close(fd);
  73. }
阅读(2419) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~