2008-09-26 15 views
11

Czasami kolorowania logfile lub inny daje dobry przegląd przy poszukiwaniu rzeczy i zachowańKolorowe grep?

Właśnie zobaczyłem, że grep posiada funkcję kolorowania

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

Jakie inne metody są tam?

Odpowiedz

14

Do wyszukiwania kodu źródłowego używam ack. Ma wiele opcji, które mają sens przy wyszukiwaniu kodu (np. Automatyczne ignorowanie katalogów SCM).

+0

DOH - że strona jest zakazane od naszej pracy ... Nie wystarczy kochać niań netto ... –

+0

Zobacz również http://code.google.com/p/ack Wygląda dobrze, off spróbować teraz! – richq

+0

Jestem zaskoczony, że petdance.com jest zbanowany. Czy możesz powiedzieć mi więcej o tym, dlaczego? –

20

Oto fragment kodu do narzędzia do rysowania dziennika, którego czasami używam.

Uwaga: działa tylko na stdin/stdout i na terminalu obsługującym kolory 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

Świetny fragment, bardzo przydatne, dziękuję! – rafalcieslak