2008-09-26 80 views
11

有時着色日誌文件或其它給出了一個很好的概述尋找東西行爲彩色grep?

當我剛看到的grep有色彩特徵

grep -C 99999 --color <regexp> <filename> 

什麼其他的方法有哪些?

回答

14

對於搜索源代碼,我使用ack。它有很多選擇對於搜索代碼是有意義的(比如自動忽略SCM目錄)。

+0

DOH - 該網站是由我們的工作場所禁止......不,你只是愛淨保姆... – 2008-09-26 09:36:50

+0

參見http://code.google.com/p/ack看起來不錯,關來試試吧現在! – richq 2008-09-29 19:37:26

1

我們使用baretail,現在如果他們增加了色彩的baregrep,那將是很好的。

20

這是我有時使用的日誌着色工具的代碼片段。

請注意,這隻適用於標準輸入/標準輸出和支持ANSI顏色的終端。

#include <stdio.h> 
#include <regex.h> 

#define MAX_LINE 4096 

#define RESET "\033[0m" 
#define BLACK "\033[30m"  /* Black */ 
#define RED  "\033[31m"  /* Red */ 
#define GREEN "\033[32m"  /* Green */ 
#define YELLOW "\033[33m"  /* Yellow */ 
#define BLUE "\033[34m"  /* Blue */ 
#define MAGENTA "\033[35m"  /* Magenta */ 
#define CYAN "\033[36m"  /* Cyan */ 
#define WHITE "\033[37m"  /* White */ 
#define BOLDBLACK "\033[1m\033[30m"  /* Bold Black */ 
#define BOLDRED  "\033[1m\033[31m"  /* Bold Red */ 
#define BOLDGREEN "\033[1m\033[32m"  /* Bold Green */ 
#define BOLDYELLOW "\033[1m\033[33m"  /* Bold Yellow */ 
#define BOLDBLUE "\033[1m\033[34m"  /* Bold Blue */ 
#define BOLDMAGENTA "\033[1m\033[35m"  /* Bold Magenta */ 
#define BOLDCYAN "\033[1m\033[36m"  /* Bold Cyan */ 
#define BOLDWHITE "\033[1m\033[37m"  /* Bold White */ 

static int selected_color = 0; 
static char *colors[] = { 
    "-green", GREEN, 
    "-black", BLACK, 
    "-red", RED, 
    "-yellow", YELLOW, 
    "-blue", BLUE, 
    "-magenta", MAGENTA, 
    "-cyan", CYAN, 
    "-white", WHITE, 
    "-boldgreen", BOLDGREEN, 
    "-boldblack", BOLDBLACK, 
    "-boldred", BOLDRED, 
    "-boldyellow", BOLDYELLOW, 
    "-boldblue", BOLDBLUE, 
    "-boldmagenta", BOLDMAGENTA, 
    "-boldcyan", BOLDCYAN, 
    "-boldwhite", BOLDWHITE, 
    NULL 
}; 

/*----------------------------------------------------------------------*/ 

int main(int argc, char *argv[]) { 
    char buf[MAX_LINE]; 
    int has_re = 0; 
    regex_t re; 

    if (argc > 1) { 
    if (argc > 2) { 
     int idx = 0; 
     while (colors[idx*2]) { 
     if (!strcmp(colors[idx*2], argv[1])) { 
      selected_color = idx; 
      break; 
     } 
     idx++; 
     } 
     if (regcomp(&re, argv[2], REG_EXTENDED | REG_NEWLINE)) { 
     printf("regcomp() failed!\n"); 
     return -1; 
     } 
    } else if (regcomp(&re, argv[1], REG_EXTENDED | REG_NEWLINE)) { 
     printf("regcomp() failed!\n"); 
     return -1; 
    } 
    has_re = 1; 
    } else { 
    printf("Usage: %s [ -red | -blue | -cyan | -white | -black | " 
      "-yellow | -magenta ] <regexp>\n", argv[0]); 
    return -1; 
    } 

    while (fgets(buf, MAX_LINE, stdin) == buf) { 
    char *bbuf = buf; 
    while (1) { 
     if (has_re) { 
     regmatch_t match[10]; 
     if (regexec(&re, bbuf, re.re_nsub + 1, match, 0)) { 
      printf("%s", bbuf); 
      break; 
     } else { 
      int i, idx; 
      for (i=idx=0; i<1; i++) { 
      if (match[0].rm_so < 0) { 
       break; 
      } else { 
       printf("%.*s", 
        (int)(match[i].rm_so-idx), 
        bbuf+idx); 
       printf("%s%.*s" RESET, 
         colors[selected_color*2+1], 
         (int)(match[i].rm_eo-match[i].rm_so), 
         bbuf+(int)match[i].rm_so); 
       idx = match[i].rm_eo; 
       bbuf += idx; 
      } 
      } 
     } 
     } 
     fflush(stdout); 
    } 
    } 

    if (has_re) { 
    regfree(&re); 
    } 

    return 0; 
}