awk의 여러 줄 변수에 대한 색상 코드 섹션

awk의 여러 줄 변수에 대한 색상 코드 섹션

변수가 있습니다 var. Code:in 이후의 행을 인쇄하고 싶지만 blue지정된 행은 삭제하고 Code:나머지는 에서 인쇄하려고 합니다 green. 우분투를 실행하는 변수 처리를 수행하기 위해 awk를 호출하는 bash 스크립트를 사용합니다.

sgr="$( tput sgr0 )"
grn="$( tput bold; tput setaf 34 )"
blu="$( tput bold; tput setaf 39 )"

var="
 Description
 Code:
  for i in {1..72..1}; do shft+=\" \"; done
 
 Details"

printf '%s\n' "$var"  \
 | awk -v kb="$blu" -v kg="$grn" -v rst="$sgr"  \
     '{ codefound = 0
        fm="%s%s%s\n"
        if (codefound) { printf(fm, kb, $0, rst) }
        else { printf(fm, kg, $0, rst) }
      }'

색상 자체를 정의하는 방법은 무엇입니까 awk?

다음을 생성하고 싶습니다(#은 텍스트의 전경색을 설명하는 데 사용됨).

 Description  # green
   for i in {1..72..1}; do shft+=" "; done  # blue
 
 Details  # green

답변1

주로 답변을 기반으로 함awk를 사용하여 bash에서 출력 색상화, 이는 이 경우에 원하는 것일 수 있으며 전경 및/또는 배경 색상(여러 개)을 변경해야 하는 유사한 경우도 있습니다.

$ cat tst.awk
BEGIN {
    split("BLACK RED GREEN YELLOW BLUE MAGENTA CYAN WHITE",tputColors)
    for (i in tputColors) {
        colorName = tputColors[i]
        colorNr = i-1

        cmd = "tput setaf " colorNr
        fgEscSeq[colorName] = ( (cmd | getline escSeq) > 0 ? escSeq : "<" colorName ">" )
        close(cmd)

        cmd = "tput setab " colorNr
        bgEscSeq[colorName] = ( (cmd | getline escSeq) > 0 ? escSeq : "<" colorName ">" )
        close(cmd)
    }

    cmd = "tput sgr0"
    colorOff = ( (cmd | getline escSeq) > 0 ? escSeq : "<sgr0>" )
    close(cmd)

    fgColor = dfltFgColor = "GREEN"
}

/Code:/ { fgColor = "BLUE"; next }
!NF { fgColor = dfltFgColor }
{ print fgEscSeq[fgColor] $0 colorOff }

여기에 이미지 설명을 입력하세요.

tput다음을 사용하여 색상을 정의 하지 않으려는 경우awk 또는 기타 방법을 통해 선 검색 및 색상 지정이스케이프 시퀀스를 사용하는 방법을 알아보세요.

답변2

awk에서 ANSI 이스케이프 코드를 사용하여 문자열 "WORD"가 포함된 행과 같은 행의 색상을 지정하려면 다음을 수행할 수 있습니다.

printf '%s\n' "$var" |
awk '
BEGIN{
       blue ="\033[1;44m"
       rst  ="\033[0m"
}
/WORD/{ $0=blue $0 rst }1'

필요한 작업을 수행하는 코드는 다음과 같습니다.

printf '%s\n' "$var" |
awk '
BEGIN{
       green ="\033[1;42m"  #default output color
       blue  ="\033[1;44m"
       rst   ="\033[0m"
}
/Code:$/  { Clr=1; next }  # active the blue colored ouptut
/Details$/{ Clr=0 }        # disable the blue colored output

{ print (Clr? blue : green) $0 rst }'

바라보다ANSI 이스케이프 코드

답변3

awk나는 이것을 사용 하지 않고 단지 sed다음을 사용할 것입니다 printf.

#!/bin/bash

var="
 Description
 Code:
  for i in {1..72..1}; do shft+=' '; done
 
 Details"

sgr="$( tput sgr0 )"
grn="$( tput bold; tput setaf 34 )"
blu="$( tput bold; tput setaf 39 )"

printf "%s" "$grn"; sed -E "s/Code:/$blu/; s/^( *Details.*)/${grn}\1${sgr}/" <<<"$var"; 

그러면 다음이 생성됩니다.

명령 출력을 컬러로 보여주는 터미널 스크린샷

주장하면 awk다음과 같이 작동합니다.

#!/bin/bash
var="
 Description
 Code:
  for i in {1..72..1}; do shft+=' '; done

 Details"

sgr="$( tput sgr0 )"
grn="$( tput bold; tput setaf 34 )"
blu="$( tput bold; tput setaf 39 )"

awk -v sgr="$( tput sgr0 )" \
    -v grn="$( tput bold; tput setaf 34 )" \
    -v blu="$( tput bold; tput setaf 39 )" \
'BEGIN{ printf "%s", grn }
{
  if(/Code:/){ printf "%s", blu }
  else if(/Details/){ printf "%s%s%s\n",grn, $0, sgr }
  else { print }
}' <<<"$var"; 

관련 정보