을 컬러 텍스트 terminal escape-character colored text file
로 변환하고 싶습니다 . BBCode
이를 위해 스위치가 색상 이스케이프 문자를 추가하는 Android 로그 파일을 만들었습니다 logcat -Cd > /sdcard/logcat.txt
. -C
출력은 다음과 같습니다.
[0m[38;5;231mV/Zygote ( 4666): Switching descriptor 55 to /dev/null
[0m[38;5;231mV/Zygote ( 4666): Switching descriptor 9 to /dev/null
[0m[38;5;40mI/ggheart ( 1111): onStop
[0m[38;5;40mI/Test ( 1111): onStop
[0m[38;5;75mD/ActivityThread( 4666): handleBindApplication:com.mxtech.videoplayer.ad
[0m[38;5;75mD/ActivityThread( 4666): setTargetHeapUtilization:0.75
[0m[38;5;75mD/ActivityThread( 4666): setTargetHeapMinFree:2097152
BBCode
색상 코드를 내가 작성한 스크립트 로 변환하려면 다음을 수행하십시오 sed
.
#!/bin/bash
#Use 'logcat -Cd > /sdcard/logcat.txt' as input file
sed '/\x1b/ {
s/\x1b\[0m\x1b\[38;5;40m/\[COLOR="Green"\]/
s/\x1b\[0m\x1b\[38;5;196m/\[COLOR="Red"\]/
s/\x1b\[0m\x1b\[38;5;75m/\[COLOR="Blue"\]/
s/\x1b\[0m\x1b\[38;5;166m/\[COLOR="Sienna"\]/
s/\x1b\[0m\x1b\[38;5;231m/\[COLOR="DarkSlateGray"\]/
s/\x1b\[38;5;40m/\[COLOR="Green"\]/
s/\x1b\[38;5;196m/\[COLOR="Red"\]/
s/\x1b\[38;5;75m/\[COLOR="Blue"\]/
s/\x1b\[38;5;166m/\[COLOR="Sienna"\]/
s/\x1b\[38;5;231m/\[COLOR="DarkSlateGray"\]/
s/\x1b\[0m/\[COLOR="Black"\]/
s/$/\[\/COLOR\]/
}' <logcat.txt >logcat2.txt
처리된 출력 텍스트는 다음과 같습니다.
[COLOR="DarkSlateGray"]V/Zygote ( 4666): Switching descriptor 55 to /dev/null[/COLOR]
[COLOR="DarkSlateGray"]V/Zygote ( 4666): Switching descriptor 9 to /dev/null[/COLOR]
[COLOR="Green"]I/ggheart ( 1111): onStop[/COLOR]
[COLOR="Green"]I/Test ( 1111): onStop[/COLOR]
[COLOR="Blue"]D/ActivityThread( 4666): handleBindApplication:com.mxtech.videoplayer.ad[/COLOR]
[COLOR="Blue"]D/ActivityThread( 4666): setTargetHeapUtilization:0.75[/COLOR]
[COLOR="Blue"]D/ActivityThread( 4666): setTargetHeapMinFree:2097152[/COLOR]
COLOR
이는 구문상 정확하고 해당 포럼 게시판에서 잘 작동하지만 태그가 여러 줄에 걸쳐 있지 않기 때문에(대부분의 게시판에서는 제한됨) 최적화되지 않고 너무 많은 문자를 낭비합니다.
동일한 색상의 선이 동일한 COLOR
탭을 닫거나 다시 열지 않는 경우 다음과 같이 표시됩니다.
[COLOR="DarkSlateGray"]V/Zygote ( 4666): Switching descriptor 55 to /dev/null
V/Zygote ( 4666): Switching descriptor 9 to /dev/null[/COLOR]
[COLOR="Green"]I/ggheart ( 1111): onStop
I/Test ( 1111): onStop[/COLOR]
[COLOR="Blue"]D/ActivityThread( 4666): handleBindApplication:com.mxtech.videoplayer.ad
D/ActivityThread( 4666): setTargetHeapUtilization:0.75
D/ActivityThread( 4666): setTargetHeapMinFree:2097152[/COLOR]
이것을 달성하는 방법에 대한 아이디어가 있습니까? 라인 기반 텍스트 프로세서가 가능합니까? shell/bash/cygwin에서 실행되는 한 필수는 아닙니다.
답변1
"Easy using awk"에 대한 설명은 sed와 관련이 있습니다.
OP는 잘 문서화되지 않은 기능을 설명합니다 logcat
(참조:범죄logcat
) 로그 항목을 기반으로 각 행에 하드코딩된 색상을 할당하도록 지시합니다.우선순위.
다음과 같은 다른 옵션도 있습니다.logcat 색상,PID 고양이그리고컬러로그캣색깔을 다르게 만들어라필드예를 들어 행당 여러 색상의 가능성을 높입니다.
다음은 하드코딩된 logcat 색상을 인식하지만 한 줄에 여러 색상을 허용하는 awk 스크립트입니다.
#!/usr/bin/awk -f
BEGIN {
colors["0"] = "Black";
colors["38;5;40"] = "Green";
colors["38;5;196"] = "Red";
colors["38;5;75"] = "Blue";
colors["38;5;166"] = "Sienna";
colors["38;5;231"] = "DarkSlateGray";
color = "";
last = "";
this = "";
save = "";
}
/\033/ {
done = "";
while ( $0 ~ /\033\[[;0-9]*m/ ) {
mark = match($0, /\033\[[;0-9]*m/ );
if ( mark > 1 ) { done = done substr($0, 1, mark - 1); }
item = substr($0, RSTART + 2, RLENGTH - 3);
$0 = substr($0, RSTART + RLENGTH);
if ( match($0, /^\033\[[;0-9]*m/ ) > 0 ) continue;
color = colors[item];
if ( done == "" ) this = color;
if ( item == "0" ) color = "";
if ( color == "" ) {
if ( $0 != "" ) last = color;
$0 = "[/COLOR]" $0;
} else if (color != last) {
$0 = "[COLOR=\"" color "\"]" $0;
last = color;
}
}
$0 = done $0;
if ( last != "" ) $0 = $0 "[/COLOR]";
}
{
if ( NR > 1 ) {
if ( this == last) sub("\[/COLOR\]$", "", save);
print save;
}
save = $0;
}
END {
if ( NR > 0 ) print save;
}
원래 예를 들면 다음과 같습니다.
^[[0m^[[38;5;231mV/Zygote ( 4666): Switching descriptor 55 to /dev/null
^[[0m^[[38;5;231mV/Zygote ( 4666): Switching descriptor 9 to /dev/null
^[[0m^[[38;5;40mI/ggheart ( 1111): onStop
^[[0m^[[38;5;40mI/Test ( 1111): onStop
^[[0m^[[38;5;75mD/ActivityThread( 4666): handleBindApplication:com.mxtech.videoplayer.ad
^[[0m^[[38;5;75mD/ActivityThread( 4666): setTargetHeapUtilization:0.75
^[[0m^[[38;5;75mD/ActivityThread( 4666): setTargetHeapMinFree:2097152
요청한 출력을 얻게 됩니다.
[COLOR="DarkSlateGray"]V/Zygote ( 4666): Switching descriptor 55 to /dev/null
V/Zygote ( 4666): Switching descriptor 9 to /dev/null
[COLOR="Green"]I/ggheart ( 1111): onStop
I/Test ( 1111): onStop
[COLOR="Blue"]D/ActivityThread( 4666): handleBindApplication:com.mxtech.videoplayer.ad
D/ActivityThread( 4666): setTargetHeapUtilization:0.75
D/ActivityThread( 4666): setTargetHeapMinFree:2097152[/COLOR]
그러나 입력을 다음으로 변경하십시오.
^[[0m^[[38;5;231mV/Zygote ( 4666): Switching descriptor 55 to /dev/null
^[[0m^[[38;5;231mV/Zygote ( 4666): Switching descriptor 9 to /dev/null
^[[0m^[[38;5;40mI/ggheart ( ^[[38;5;75mI/ggheart 1111^[[0m): onStop
^[[0m^[[38;5;40mI/Test ( 1111): onStop
^[[0m^[[38;5;75mD/ActivityThread( 4666): handleBindApplication:com.mxtech.videoplayer.ad
^[[0m^[[38;5;75mD/ActivityThread( 4666): setTargetHeapUtilization:0.75
^[[0m^[[38;5;75mD/ActivityThread( 4666): setTargetHeapMinFree:2097152
다음 결과를 제공합니다.
[COLOR="DarkSlateGray"]V/Zygote ( 4666): Switching descriptor 55 to /dev/null
V/Zygote ( 4666): Switching descriptor 9 to /dev/null[/COLOR]
[COLOR="Green"]I/ggheart ( [COLOR="Blue"]I/ggheart 1111[/COLOR]): onStop
[COLOR="Green"]I/Test ( 1111): onStop
[COLOR="Blue"]D/ActivityThread( 4666): handleBindApplication:com.mxtech.videoplayer.ad
D/ActivityThread( 4666): setTargetHeapUtilization:0.75
D/ActivityThread( 4666): setTargetHeapMinFree:2097152[/COLOR]
답변2
더 쉽게 들리네요 perl
:
perl -0777 -pe '
BEGIN{
%c = (
"38;5;40" => "Green",
"38;5;196" => "Red",
"38;5;75" => "Blue",
"38;5;166" => "Sienna",
"38;5;231" => "DarkSlateGray",
"38;5;40" => "Green",
"38;5;196" => "Red",
"38;5;75" => "Blue",
"38;5;166" => "Sienna",
"38;5;231" => "DarkSlateGray",
"0" => "Black");
$esc = qr{\e\[([\d;]*)m};
}
s{$esc(.*?)(?=$|$esc)}{
$ret = $2;
if ($2 ne "" && $1 ne $last) {
$ret = (defined($last) && "[/COLOR]") . "[COLOR=\"$c{$1}\"]$2";
$last = $1
}
$ret
}gse;
s{$}{[/COLOR]} if $last'
(여기서는 게으른 접근 방식을 취하고 전체 파일을 메모리에 로드합니다.