У меня есть приложение, которое генерирует некоторый вывод:
$ 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), чтобы:
[
и ]
всегда серый.<s:PocApi
, выделено желтым цветом.DBG
, выделено светло-серым цветом.ERR
, выделено красным цветом.Обратите внимание, что сообщение всегда находится между ]
и <
.
Любые идеи, как я могу это сделать? Возможно printf
, но я не вижу способа сопоставления с образцом. Спасибо за помощь.
О, и чего бы это ни стоило, my-app
— это долго работающее приложение, которое выполняет потоковую передачу вывода.
пожалуйста, обновите вопрос с образцом строки с ERR
у вас уже есть последовательности для цветов? если да, пожалуйста, обновите вопрос с последовательностями
Я обновил ERR
и правила для учета повторяющихся условий соответствия. Что касается цветовых кодов, это не имеет большого значения. Я просто хочу знать, как применить цвет, любой цвет, к узору. Спасибо за помощь!
Чтобы смоделировать вывод из 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 ...
)DBG
, так и <s:PocApi
), поэтому я выбрал произвольный прецедент (шаблоны, сопоставленные позже в сценарии, имеют приоритет над сопоставленными шаблонами ранее в сценарии)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
Это возвращает ошибку: sed: 1: "s/.[^[]*([^]]*ERR])([^< ...": bad flag in substitute command: '}'
@ChrisMiller У тебя Mac?
@markp-fuso GNU sed
4.7
Да, я на macOS.
@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 '}'
что делать, если у вас есть 2 (или более) совпадения в строке (например, все строки содержат
DBG
, а одна из этих строк содержит<s:PocApi
, и все строки также содержат[....]
); есть ли прецендент, какое цветовое правило использовать?