【问题标题】:What are the equivalents of colored grep?彩色grep?
【发布时间】:2010-09-13 09:29:21
【问题描述】:

在查找stuff行为

时,有时为日志文件或其他着色提供一个很好的概览

刚刚看到grep有着色功能

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

还有哪些其他方法?

【问题讨论】:

    标签: debugging unix logging command-line grep


    【解决方案1】:

    这是我有时使用的日志着色工具的 sn-p。

    请注意,这只适用于标准输入/标准输出和支持 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;
    }
    

    【讨论】:

      【解决方案2】:

      为了搜索源代码,我使用ack。它有很多对搜索代码有意义的选项(例如自动忽略 SCM 目录)。

      【讨论】:

      • DOH - 我们的工作场所禁止该网站...您不只是喜欢网络保姆吗...
      • 我很惊讶 petdance.com 被禁止了。你能告诉我更多关于为什么吗?
      • 对于那些想知道的人,ack 现在托管在 github 上 github.com/petdance/ack
      【解决方案3】:

      有很多程序支持着色,比如Colortail

      也许这也有帮助:GenericColouriser

      【讨论】:

        【解决方案4】:

        我们使用baretail,现在如果他们为baregrep 添加颜色,那就太好了。

        【讨论】:

          【解决方案5】:

          这是一个较老的问题,但如果有人还在寻找,我最近创建了colorize,这是一个允许指定固定模式或正则表达式以匹配特定颜色的工具。它开箱即用,具有用于指定突出显示的直观语法,并将 docopt 作为其唯一依赖项。

          colorize.py -f 'This is an interesting line=Blue' -f 'Different topic=Red' Input.log
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-01-22
            • 2012-10-01
            • 2018-10-25
            • 2022-10-15
            • 2013-08-31
            • 2020-04-09
            • 1970-01-01
            • 2012-02-28
            相关资源
            最近更新 更多