【问题标题】:awk adding color code to textawk 向文本添加颜色代码
【发布时间】:2013-01-07 01:45:23
【问题描述】:
awk -F: '{ printf  "%-3s %-2s","\n" $1 $2; }'

如何添加颜色代码? '\e[1;32m'

我尝试添加到 printf,它给我输出字符串而不是颜色代码..

'\e[1;32m' .......

【问题讨论】:

  • 该颜色代码是否适用于普通的echo

标签: linux bash shell awk


【解决方案1】:

awk 无法将 '\e' 识别为转义字符的代码。这是一种解决方法(可能存在更优雅的方法):

# Decimal 27 is the ASCII codepoint for the escape character
awk '{ printf "%c[1;32m foo\n", 27 }' <<<foo

【讨论】:

  • 怎么样.. 使用 \033 而不是 \e
  • 我总是忘记八进制转义。
【解决方案2】:
 awk 'BEGIN{print "^[[1;33mYELLOW"}' 

将以黄色(彩色)打印字符串 YELLOW

注意 第一个 ^[ 你必须输入 ctrl-v 然后 ESC

我会添加一个屏幕截图来显示。

上面的截图显示它在 zsh 和 bash 下工作。

【讨论】:

    【解决方案3】:

    希望这可以帮助任何寻找答案的人!

    如您所见,函数和各种初始化使得编写如下非常简单的打印行成为可能。

    print colour("Red")$1colour("Blue")$0colour("None");
    

    对于colour 函数,您可以传入颜色的整数值或名称。它采用以下格式的参数。

    colour( <attribute> , <background-colour> , <foreground-colour> )
    colour( <background-colour> , <foreground-colour> )
    colour( <foreground-colour> )
    

    您可以选择性地提供所需的参数。

    function isnumeric(x)
    {
        return ( x == x+0 );
    }
    
    function name_to_number(name, predefined)
    {
        if (isnumeric(name))
            return name;
    
        if (name in predefined)
            return predefined[name];
    
        return name;
    }
    
    function colour(v1, v2, v3)
    {
        if (v3 == "" && v2 == "" && v1 == "")
            return;
    
        if (v3 == "" && v2 == "")
            return sprintf("%c[%dm", 27, name_to_number(v1, fgcolours));
        else if (v3 == "")
            return sprintf("%c[%d;%dm", 27, name_to_number(v1, bgcolours), name_to_number(v2, fgcolours));
        else
            return sprintf("%c[%d;%d;%dm", 27, name_to_number(v1, attributes), name_to_number(v2, bgcolours), name_to_number(v3, fgcolours));
    }
    
    BEGIN {
        # hack to use attributes for just "None"
        fgcolours["None"] = 0;
    
        fgcolours["Black"] = 30;
        fgcolours["Red"] = 31;
        fgcolours["Green"] = 32;
        fgcolours["Yellow"] = 33;
        fgcolours["Blue"] = 34;
        fgcolours["Magenta"] = 35;
        fgcolours["Cyan"] = 36;
        fgcolours["White"] = 37;
    
        bgcolours["Black"] = 40;
        bgcolours["Red"] = 41;
        bgcolours["Green"] = 42;
        bgcolours["Yellow"] = 43;
        bgcolours["Blue"] = 44;
        bgcolours["Magenta"] = 45;
        bgcolours["Cyan"] = 46;
        bgcolours["White"] = 47;
    
        attributes["None"] = 0;
        attributes["Bold"] = 1;
        attributes["Underscore"] = 4;
        attributes["Blink"] = 5;
        attributes["ReverseVideo"] = 7;
        attributes["Concealed"] = 8;
    }
    
    {
        print colour("Red")$1colour("Blue")$0colour("None");
    }
    

    【讨论】:

    • 极度低估的评论。如果这是reddit,我会给你一个奖励。我会很享受这个。谢谢!
    【解决方案4】:

    \033[?m 正确引用给出颜色:

    awk 'BEGIN{ print "\033[34msomething in colour\033[0m";}'
    

    请注意如何在下面取消转义$1

    echo something | awk '{ print "\033[34m"$1" in colour \033[0m";}'
    

    【讨论】:

      【解决方案5】:
      BDF()
      {
      #awk 'BEGIN{ print "\033[34msomething in colour\033[0m";}'
      #bdf $spool $data $sysout ~ /home/fnsonlh  |grep -v avail| awk '{print $5" "$4"        "}' | tail -n +2 |tr -d "\012"
      bdf $spool $data $sysout ~ /home/fnsonlh  |grep -v avail| awk '{if($4 > 89)
       {
         print "\033[0;31m"$5" "$4"\033[0m      "
        }
       else
       {
        print "\033[0;32m"$5" "$4"\033[0m      "
       }}' |tail -n +2 |tr -d "\012"
      #"\012 is new line caracter"
      echo
      #/usr/bin/w -u
      uptime
      }
      #nishant.chawre@gmail.com
      

      【讨论】:

      • 纯代码的答案通常不受欢迎。请编辑您的答案,以包括代码正在做什么以及它如何回答问题的描述。
      【解决方案6】:

      试试这个例子:

      echo "line 1
      line 2" | awk '/line/ {print "\033[32m" $1 "\033[31m" $2 }'
      

      颜色由"\033[32m"给出

      颜色:

      30 - black   34 - blue          
         31 - red     35 - magenta       
         32 - green   36 - cyan          
         33 - yellow  37 - white     
      

      【讨论】:

        【解决方案7】:

        定义两个或你需要的变量

        例子:

        GREENB='\033[0;41m'    #Green Background (Color verde de fondo)
        GREEN='\033[0;32m'     #Green Text (Color verde en el texto
        REDB='\033[0;41m'      #Red Background (Color rojo de fondo)
        RED='\033[0;31m'       #Red text (Color rojo en el texto)
        NORMALB='\033[0;49m'   #Default background (Color por defecto de fondo)
        NORMAL='\033[0m'       #Default foreground (Color por defecto del texto)
        

        awk 代码: echo "This is a test" | awk -vRojo=${RED} -v NC=${NORMAL} '{print Rojo $1, $2, NC $3, $4}'


        颜色代码说明

        \e[${ATTRIBUTE};${BACKGROUND_COLOR};${FOREGROUND_COLOR}m

        地点:

        • \e&lt;Esc&gt; 字符(可以是\e\033\x1B
        • ${ATTRIBUTE}:定义文本的风格普通粗体/明亮暗淡、下划线闪烁反向隐藏)。 0 为正常;
        • ${BACKGROUND_COLOR}:定义背景颜色;
        • ${FOREGROUND_COLOR}:定义前景颜色;

        更多信息

        关于 Bash 颜色的更多颜色和信息 here

        【讨论】:

        • GREENB = "\ 033 [0; 41m" 永远不会起作用,因为 bash 中的赋值运算符不能在变量名和变量值之间有空格...所以正确的语法是 GREENB="... 另外,所有变量值内的那些空格将使 awk 失败并出现错误awk: fatal: cannot open file `[0;' for reading (No such file or directory) 所以必须删除它们...我知道您这样做是为了使其更具可读性和更容易理解,但它的语法完全错误...更正
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-06
        • 1970-01-01
        • 1970-01-01
        • 2012-06-19
        • 1970-01-01
        • 2021-03-02
        相关资源
        最近更新 更多