Раскрасить вывод терминала по шаблону

У меня есть приложение, которое генерирует некоторый вывод:

$ my-app
[metadata] - [21:06:51 DBG] Some message 111 <s:Microsoft.AspNetCore.Routing.EndpointRoutingMiddleware>
[metadata] - [21:06:52 DBG] Some message 222 <s:Microsoft.AspNetCore.Hosting.Diagnostics>
[metadata] - [21:06:52 ERR] Some message 223 <s:Microsoft.AspNetCore.Routing.Matching.DfaMatcher>
[metadata] - [21:06:54 DBG] Some message 333 <s:PocApi.MyApp.Foo>

Я удаляю часть вывода [metadata] - следующим образом:

$ my-app | sed -r 's/.*\] - *//'
[21:06:51 DBG] Some message 111 <s:Microsoft.AspNetCore.Routing.EndpointRoutingMiddleware>
[21:06:52 DBG] Some message 222 <s:Microsoft.AspNetCore.Hosting.Diagnostics>
[21:06:52 ERR] Some message 223 <s:Microsoft.AspNetCore.Routing.Matching.DfaMatcher>
[21:06:54 DBG] Some message 333 <s:PocApi.MyApp.Foo>

Теперь я хочу закодировать вывод цветом (т. е. закодировать с помощью цветовых кодов ANSI), чтобы:

  1. Текст внутри и включая [ и ] всегда серый.
  2. Сообщение в строках, содержащих <s:PocApi, выделено желтым цветом.
  3. Сообщение в строках, содержащих DBG, выделено светло-серым цветом.
  4. Сообщение в строках, содержащих ERR, выделено красным цветом.

Обратите внимание, что сообщение всегда находится между ] и <.

Любые идеи, как я могу это сделать? Возможно printf, но я не вижу способа сопоставления с образцом. Спасибо за помощь.

О, и чего бы это ни стоило, my-app — это долго работающее приложение, которое выполняет потоковую передачу вывода.

что делать, если у вас есть 2 (или более) совпадения в строке (например, все строки содержат DBG, а одна из этих строк содержит <s:PocApi, и все строки также содержат [....]); есть ли прецендент, какое цветовое правило использовать?

markp-fuso 02.01.2023 23:16

пожалуйста, обновите вопрос с образцом строки с ERR

markp-fuso 02.01.2023 23:17

у вас уже есть последовательности для цветов? если да, пожалуйста, обновите вопрос с последовательностями

markp-fuso 02.01.2023 23:18

Я обновил ERR и правила для учета повторяющихся условий соответствия. Что касается цветовых кодов, это не имеет большого значения. Я просто хочу знать, как применить цвет, любой цвет, к узору. Спасибо за помощь!

Chris Miller 02.01.2023 23:29
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
83
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Чтобы смоделировать вывод из my-app:

$ cat input
[metadata] - [21:06:51 DBG] Some message 111 <s:Microsoft.AspNetCore.Routing.EndpointRoutingMiddleware>
[metadata] - [21:06:52 DBG] Some message 222 <s:Microsoft.AspNetCore.Hosting.Diagnostics>
[metadata] - [21:06:52 ERR] Some message 223 <s:Microsoft.AspNetCore.Routing.Matching.DfaMatcher>
[metadata] - [21:06:54 DBG] Some message 333 <s:PocApi.MyApp.Foo>

Одна awk идея:

while read -r line
do
    echo "${line}"
    sleep 2
done < input |
awk '
BEGIN       {          # foreground colors    # background colors
              red    = "\033[1;31m"           # 41m
              green  = "\033[1;32m"           # 42m
              yellow = "\033[1;33m"           # 43m
              blue   = "\033[1;34m"           # 44m
              purple = "\033[1;35m"           # 45m
              reset  = "\033[0m"
            }

/DBG/       { msg_color=blue   }
/<s:PocApi/ { msg_color=yellow }
/ERR/       { msg_color=red    }

            { line=$0

              pos=index(line,"] - ")          # these 2 lines replace
              line=substr(line,pos+4)         # the current sed script

              pos=index(line,"]")
              out=green substr(line,1,pos) reset " " msg_color
              line=substr(line,pos+2)

              pos=index(line,"<")
              out=out substr(line,1,pos-2) reset substr(line,pos-1)
              print out
            }
'

Это генерирует:

ПРИМЕЧАНИЯ:

  • предполагается, что все строки начинаются с ^[...] - [...], за которым в какой-то момент следует стрелка влево (<)
  • while read ... do < input | предназначен для имитации вывода программы OP, передаваемого в awk (т.е. my-app | awk ...)
  • OP не предоставил правил для того, что происходит, когда 2 (или более) правила применяются к одной и той же строке (например, строка содержит как DBG, так и <s:PocApi), поэтому я выбрал произвольный прецедент (шаблоны, сопоставленные позже в сценарии, имеют приоритет над сопоставленными шаблонами ранее в сценарии)
  • предполагается, что перед/после всех сообщений есть один пробел, и указанные пробелы не должны быть раскрашены
  • цветовые коды взяты из этой вики-страницы; OP должен иметь возможность находить дополнительные цвета с помощью общего веб-поиска, например ansi color codes; также имейте в виду, что доступные цвета могут различаться в зависимости от терминала (типа)

Использование sed

$ sed -E "s/.[^[]*([^]]*ERR])([^<]*)/$(tput setaf 8)\1$(tput sgr 0)$(tput setaf 9)\2$(tput sgr 0)/;\
/DBG][^<]*<s:PocApi/s/.[^[]*([^]]*])([^<]*)/$(tput setaf 8)\1$(tput sgr 0)$(tput setaf 11)\2$(tput sgr 0)/;\
/<s:PocApi/ ! {s/.[^[]*([^]]*DBG])([^<]*)/$(tput setaf 8)\1$(tput sgr 0)$(tput setaf 7)\2$(tput sgr 0)/}" input_file

Если вам нужно определить, какие аргументы добавить в tput, вы можете проверить gist.github.com/dtmilano/4055d6df5b6e4ea87c5a72dc2d604193

Diego Torres Milano 03.01.2023 00:55

Это возвращает ошибку: sed: 1: "s/.[^[]*([^]]*ERR])([^< ...": bad flag in substitute command: '}'

Chris Miller 03.01.2023 09:47

@ChrisMiller У тебя Mac?

HatLess 03.01.2023 09:49

@markp-fuso GNU sed 4.7

HatLess 03.01.2023 09:51

Да, я на macOS.

Chris Miller 04.01.2023 00:18

@ChrisMiller Тогда это небольшое изменение будет работать на MacOS sed -Ee "s/.[^[]*([^]]*ERR])([^<]*)/$(tput setaf 8)\1$(tput sgr 0)$(tput setaf 9)\2$(tput sgr 0)/;\ /DBG][^<]*<s:PocApi/s/.[^[]*([^]]*])([^<]*)/$(tput setaf 8)\1$(tput sgr 0)$(tput setaf 11)\2$(tput sgr 0)/;\ /<s:PocApi/ ! {s/.[^[]*([^]]*DBG])([^<]*)/$(tput setaf 8)\1$(tput sgr 0)$(tput setaf 7)\2$(tput sgr 0)/" -e '}'

HatLess 04.01.2023 00:48

Другие вопросы по теме