Colored grep?

前端 未结 5 1462
梦如初夏
梦如初夏 2020-12-13 16:19

Sometimes coloring a logfile or other gives a good overview when looking for stuff and behaviors

I just saw that grep have a coloring feature

相关标签:
5条回答
  • 2020-12-13 16:44

    Here is a snippet for a log coloring tool I sometimes use.

    Note that is only works against stdin/stdout and in a terminal supporting ANSI colors.

    #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;
    }
    
    0 讨论(0)
  • 2020-12-13 16:55

    For searching source code, I use ack. It's got a lot of options that make sense for searching code (such as automatically ignoring SCM directories).

    0 讨论(0)
  • 2020-12-13 16:55

    This is an older question, but in case anyone is still looking, I recently created colorize, a tool which allows one to specify either fixed patterns or regular expressions to match with specific colors. It works out of the box with an intuitive syntax for specifying highlighting, and docopt as its only dependency.

    colorize.py -f 'This is an interesting line=Blue' -f 'Different topic=Red' Input.log
    
    0 讨论(0)
  • 2020-12-13 17:00

    There are many programs that support coloring like Colortail

    Maybe this can be helpful too: GenericColouriser

    0 讨论(0)
  • 2020-12-13 17:04

    We use baretail, now if they added color to their baregrep, that would be nice.

    0 讨论(0)
提交回复
热议问题