2008-09-26 21 views
11

Đôi khi tô màu một logfile hoặc khác đưa ra một cái nhìn tổng quan tốt khi tìm kiếm thứhành viMàu grep?

Tôi chỉ thấy grep rằng có một tính năng màu

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

gì các phương pháp khác được không?

Trả lời

14

Để tìm mã nguồn, tôi sử dụng ack. Nó có rất nhiều tùy chọn có ý nghĩa cho việc tìm kiếm mã (chẳng hạn như tự động bỏ qua các thư mục SCM).

+0

DOH - trang web đó bị cấm từ nơi làm việc của chúng tôi ... không bạn chỉ yêu vú em Net ... –

+0

Xem thêm http://code.google.com/p/ack Trông tốt, ngoài khơi để thử nó hiện nay! – richq

+0

Tôi ngạc nhiên khi petdance.com bị cấm. Bạn có thể cho tôi biết thêm về lý do tại sao không? –

1

Chúng tôi sử dụng baretail, bây giờ nếu họ thêm màu sắc để baregrep của họ, điều đó sẽ tốt đẹp.

20

Đây là đoạn trích cho công cụ tạo nhật ký màu mà đôi khi tôi sử dụng.

Lưu ý rằng chỉ hoạt động với stdin/stdout và trong thiết bị đầu cuối hỗ trợ màu 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; 
} 
+1

Đoạn trích tuyệt vời, rất hữu ích, cảm ơn! – rafalcieslak