it-mot-dan-vi.com

Xóa ký tự điều khiển (bao gồm mã / màu của bảng điều khiển) khỏi đầu ra tập lệnh

Tôi có thể sử dụng lệnh "script" để ghi lại một phiên tương tác tại dòng lệnh. Tuy nhiên, điều này bao gồm tất cả các ký tự điều khiển mã màu. Tôi có thể xóa các ký tự điều khiển (như backspace) bằng "col -b", nhưng tôi không thể tìm thấy một cách đơn giản để xóa mã màu.

Lưu ý rằng tôi muốn sử dụng dòng lệnh theo cách thông thường, vì vậy đừng muốn tắt màu ở đó - tôi chỉ muốn xóa chúng khỏi đầu ra tập lệnh. Ngoài ra, tôi biết có thể chơi xung quanh và thử tìm một regrec để sửa chữa mọi thứ, nhưng tôi hy vọng có một cách đơn giản hơn (và đáng tin cậy hơn - nếu có một mã tôi không biết khi tôi phát triển giải pháp regrec?).

Để hiển thị vấn đề:

[.__.] spl62 tmp: script [.__.] Tập lệnh đã bắt đầu, tập tin là TypeScript [.__.] spl62 lepl: ls [.__.] add-licence.sed build-example.sh commit-test Push-docs .sh [.__.] add-licence.sh build.sh xóa-licence.sed setup.py [.__.] asn build-test.sh xóa-licence.sh src [.__.] build-doc.sh dọn dẹp doc-src test.ini [.__.] spl62 lepl: exit [.__.] Tập lệnh đã hoàn tất, tập tin là TypeScript [.__.] spl62 tmp: cat -v TypeScript [.__.] Script bắt đầu vào ngày 09 tháng 6 2011 09:47:27 AM CLT [.__.] Spl62 lepl: ls ^ M [.__.] ^ [[0m ^ [[00madd-licence.sed ^ [[0m ^ [[00; 32mbuild-example.sh ^ [[0m ^ [[00mcommit-test ^ [[0m ^ [[00; 32mpush-docs.sh ^ [[0m ^ M [.__.] ^ [[00; 32madd-licence.sh ^ [[0m ^ [[00; 32mbuild.sh ^ [[0m ^ [[00mdelete-licence.sed ^ [[0m ^ [[00msetup.py ^ [[0m ^ M [.__.] ^ [[01; 34masn ^ [[0m ^ [[00; 32mbuild-test.sh ^ [[0m ^ [[00; 32mdelete-licence.sh ^ [[0m ^ [[01; 34msrc ^ [[0m ^ M [.__.] ^ [[00; 32mbuild-doc.sh ^ [[0m ^ [[00; 32mclean ^ [[0m ^ [[01; 34mdoc-src ^ [[0m ^ [[00mtest.ini ^ [[0m ^ M [.__.] Spl62 lepl: exit ^ M [.__.] [.___] Tập lệnh được thực hiện vào ngày 09 tháng 9 Tháng 6 năm 2011 09:47:29 AM CLT [.__.] Spl62 tmp: col -b <TypeScript [.__.] Script bắt đầu vào ngày 09 tháng 6 năm 2011 09:47:27 AM CLT [.__.] Spl62 lepl: ls [.__.] 0m00madd-licence.sed0m 00; 32mbuild-example.sh0m 00mcommit-test0m 00; 32mpush-docs.sh0m [.__.] 00; 32madd-licence.sh0m 00; 32mbuild.m0m .py0m [.__.] 01; 34masn0m 00; 32mbuild-test.sh0m 00; 32mdelete-licence.sh0m 01; 34msrc0m [.__.] 00; 32mbuild-doc.sh0m 00; 32mcleanm [.__.] spl62 lepl: exit [.__.] [.__
71
andrew cooke

Tập lệnh sau sẽ lọc ra tất cả các chuỗi điều khiển ANSI/VT100/xterm cho (dựa trên ctlseqs ). Đã kiểm tra tối thiểu, vui lòng báo cáo bất kỳ trận đấu nào dưới hoặc quá khớp.

#!/usr/bin/env Perl
## uncolor — remove terminal escape sequences such as color changes
while (<>) {
    s/ \e[ #%()*+\-.\/]. |
       \e\[ [ -?]* [@-~] | # CSI ... Cmd
       \e\] .*? (?:\e\\|[\a\x9c]) | # OSC ... (ST|BEL)
       \e[P^_] .*? (?:\e\\|\x9c) | # (DCS|PM|APC) ... ST
       \e. //xg;
    print;
}

Các vấn đề đã biết:

  • Không phàn nàn về trình tự không đúng định dạng. Đó không phải là những gì kịch bản này là dành cho.
  • Đối số chuỗi nhiều dòng đến DCS/PM/APC/OSC không được hỗ trợ.
  • Byte trong phạm vi 128 Pha159 có thể được phân tích cú pháp dưới dạng ký tự điều khiển, mặc dù điều này hiếm khi được sử dụng. Đây là phiên bản phân tích các ký tự điều khiển không phải ASCII (điều này sẽ thu thập văn bản không phải ASCII trong một số mã hóa bao gồm UTF-8).
#!/usr/bin/env Perl
## uncolor — remove terminal escape sequences such as color changes
while (<>) {
    s/ \e[ #%()*+\-.\/]. |
       (?:\e\[|\x9b) [ -?]* [@-~] | # CSI ... Cmd
       (?:\e\]|\x9d) .*? (?:\e\\|[\a\x9c]) | # OSC ... (ST|BEL)
       (?:\e[P^_]|[\x90\x9e\x9f]) .*? (?:\e\\|\x9c) | # (DCS|PM|APC) ... ST
       \e.|[\x80-\x9f] //xg;
    print;
}

Cập nhật câu trả lời của Gilles để loại bỏ trả về vận chuyển và xóa lùi các ký tự trước đó, cả hai đều quan trọng đối với tôi đối với một TypeScript được tạo trên Cygwin:

#!/usr/bin/Perl
while (<>) {
    s/ \e[ #%()*+\-.\/]. |
       \r | # Remove extra carriage returns also
       (?:\e\[|\x9b) [ -?]* [@-~] | # CSI ... Cmd
       (?:\e\]|\x9d) .*? (?:\e\\|[\a\x9c]) | # OSC ... (ST|BEL)
       (?:\e[P^_]|[\x90\x9e\x9f]) .*? (?:\e\\|\x9c) | # (DCS|PM|APC) ... ST
       \e.|[\x80-\x9f] //xg;
       1 while s/[^\b][\b]//g;  # remove all non-backspace followed by backspace
    print;
}
31
dewtell

Tôi sẽ sử dụng sed trong trường hợp này.

làm:

cat -v TypeScript | sed -e "s/\x1b\[.\{1,5\}m//g"

sed -e "s/search/thay thế/g" là công cụ tiêu chuẩn. regex được giải thích như sau:

\x1b khớp với Thoát trước mã màu \[ khớp với khung mở đầu tiên .\{1,5\} khớp từ 1 đến 5 của bất kỳ ký tự đơn nào. Phải \ các dấu ngoặc nhọn để giữ Shell không xáo trộn chúng. m ký tự cuối cùng trong regex - thường theo dõi mã màu. // chuỗi rỗng để thay thế mọi thứ bằng. g khớp nó nhiều lần trên mỗi dòng.

12
Glorytoad
cat TypeScript | Perl -pe 's/\e([^\[\]]|\[.*?[a-zA-Z]|\].*?\a)//g' | col -b > TypeScript-processed
9
Peter Nore
# The "sed -r" trick does not work on every Linux, I still dunno why:
DECOLORIZE='eval sed "s,${END}\[[0-9;]*[m|K],,g"'

=> cách sử dụng :

<commands that type colored output> | ${DECOLORIZE}

đã thử nghiệm trên: - AIX 5.x/6.1/7.1 - Linux Mandrake/Mandriva/SLES/Fedora - SunOS

6
scavenger

Có một ansi2txt lệnh trong colorized-logs gói trên Ubuntu. Nó loại bỏ mã màu ANSI độc đáo, nhưng nó không xử lý những thứ như thanh tiến trình được tạo ra bằng cách phát ra ^H hoặc là ^M ký tự để ghi đè văn bản tại chỗ. col -b có thể xử lý những người đó , vì vậy để có kết quả tốt nhất, bạn có thể kết hợp cả hai

cat TypeScript | ansi2txt | col -b
5
Marius Gedminas

Tôi đã giải quyết vấn đề bằng cách chạy scriptreplay trong một màn hình và kết xuất bộ đệm cuộn lại vào một tệp.

Các kịch bản mong đợi sau đây làm điều này cho bạn.

Nó đã được thử nghiệm cho logfiles với tối đa 250.000 dòng. Trong thư mục làm việc, bạn cần scriptlog của mình, một tệp có tên là "thời gian" với 10.000.000 lần dòng "1 10" trong đó và tập lệnh. Tôi cần tên scriptfile của bạn làm đối số dòng lệnh, như ./name_of_script name_of_scriptlog.

#!/usr/bin/expect -f 

set logfile [lindex $argv 0]

if {$logfile == ""} {puts "Usage: ./script_to_readable.exp \$logfile."; exit}

set timestamp [clock format [clock sec] -format %Y-%m-%d,%H:%M:%S]
set pwd [exec pwd]
if {! [file exists ${pwd}/time]} {puts "ERROR: time file not found.\nYou need a file named time with 10.000.000 times the line \"1 10\" in the working directory for this script to work. Please provide it."; exit}
set wc [exec cat ${pwd}/$logfile | wc -l]
set height [ expr "$wc" + "100" ]
system cp $logfile ${logfile}.tmp
system echo $timestamp >> ${logfile}.tmp
set timeout -1
spawn screen -h $height -S $timestamp 
send "scriptreplay -t time -s ${logfile}.tmp 100000 2>/dev/null\r"
expect ${timestamp} 
send "\x01:hardcopy -h readablelog.${timestamp}\r"

send "exit\r"

system sed '/^$/d' readablelog.$timestamp >> readablelog2.$timestamp
system head -n-2 readablelog2.$timestamp >> ${logfile}.readable.$timestamp
system rm -f readablelog.$timestamp readablelog2.$timestamp ${logfile}.tmp

Các tập tin thời gian có thể được tạo ra bởi

for i in $(seq 1 10000000); do echo "1 10" >> time; done
3
hnkchnsk

Tôi muốn sử dụng các công cụ chuyên dụng để chuyển đổi đầu ra tập lệnh thành văn bản thuần túy, được liên tục hỗ trợ và kiểm tra tốt, qua chế độ regrec tùy chỉnh. Vì vậy, điều này đã làm việc cho tôi:

$ cat TypeScript | ansi2txt | col -bp > TypeScript.txt.bp    
$ cat -v TypeScript.txt.bp

lệnh script ghi vào tập tin TypeScript ansi2txt - chuyển đổi mã ansi với các lối thoát như mã màu, không gian sau, vv thành văn bản thông thường, tuy nhiên tôi thấy rằng cặp vợ chồng vẫn thoát. col -bp - loại bỏ chúng hoàn toàn.

Tôi đã thử nghiệm điều này trên sàn nhảy Ubuntu mới nhất và nó hoạt động.

1
Dmytro Brazhnyk

Tôi thấy rằng chỉ cần sử dụng cat là tất cả những gì tôi cần để xem đầu ra của script trong thiết bị đầu cuối. Điều này không giúp ích khi chuyển hướng đầu ra sang tệp khác, nhưng làm cho kết quả có thể đọc được, không giống như cat -v, col -b hoặc trình soạn thảo văn bản.

Để loại bỏ màu sắc hoặc lưu kết quả vào một tệp, hãy sao chép và dán thủ công từ cat vào trình soạn thảo văn bản hoặc vào một lệnh cat khác, tức là:

cat > endResult << END
<paste_copied_text_here>
END
1
Roger Dueck

Tìm thấy câu hỏi này trong khi tìm kiếm một giải pháp cho cùng một vấn đề. Đào sâu hơn một chút và tìm thấy kịch bản này tại Live Journal tại liên kết này. Tôi đã làm việc hoàn hảo cho tôi. Đây cũng là một bài viết rất hay về vấn đề này và cách giải pháp hoạt động. Chắc chắn giá trị đọc. http://jdimpson.livejournal.com/7040.html

#!/usr/bin/Perl -wp

# clean up control characters and other non-text detritus that shows up 
# when you run the "script" command.

BEGIN {
# xterm titlebar escape sequence
$xtermesc = "\x1b\x5d\x30\x3b";

# the occurence of a backspace event (e.g. cntrl H, cntrol W, or cntrl U)
$backspaceevent = "\x1b\\\x5b\x4b"; # note escaping of third character

# ANSI color escape sequence
$ansiesc = qr/\x1b\[[\d;]*?m/;

# technically, this is arrow-right. For some reason, being used against
# very long backspace jobs. I don't fully understand this, as evidenced
# by the fact that is off by one sometimes.
$bizarrebs = qr/\x1b\[C/;

# used as part of the xterm titlebar mechanism, or when
# a bell sounds, which might happen when you backspace too much.
$bell = "\x07"; # could use \a

$cr = "\x0d"; # could use \r

$backspace = "\x08"; # could use \b
}

s/$xtermesc.+?$bell//g;
s/[$cr$bell]//g;
s/${backspaceevent}//g;
s/$ansiesc//g;
while (s/(.)(?=$backspace)//) { s/$backspace//; } # frickin' sweet 
# For every ^H delete the character immediately left of it, then delete the ^H.
# Perl's RE's aren't R, so I wonder if I could do this in one expression.
while (s/(..)(?=$bizarrebs)//) { s/$bizarrebs//; }
1
SammerV

Mặc dù các giải pháp được đưa ra cho đến nay vẫn hoạt động tốt để loại bỏ các chuỗi điều khiển, tuy nhiên chúng cũng loại bỏ các mã định dạng. Kết quả là các bảng trong đầu ra được ghép lại với nhau. Yêu cầu của tôi chỉ là có thể xem và tìm kiếm trong các tệp nhật ký phiên được thu thập từ thiết bị đầu cuối. Giải pháp phù hợp nhất với tôi là sử dụng ít -r.

less -r session.log
0
AliA