質問: スクリプト出力からの制御文字(コンソールコード/色を含む)の削除 「script」コマンドを使用して、コマンドラインでインタラクティブセッションを記録できます。ただし、これにはすべての制御文字andカラーコードが含まれます。 「col -b」で制御文字(バックスペースなど)を削除できますが、カラーコードを削除する簡単な方法が見つかりません。コマンドラインを通常の方法で使用したいので、そこで色を無効にしたくないことに注意してください。スクリプトの出力から色を削除したいだけです。また、私は遊んで、正規表現を見つけて修正することができることを知っていますが、より単純な(そしてより信頼性の高い-正規表現を開発するときに知らないコードがある場合はどうなりますか?).問題を表示するには: spl62 tmp:スクリプト スクリプトが開始されました。ファイルはtypescript spl62 lepl:ls add-licence.sed build-example.sh commit-test push-docs .sh add-licence.sh build.sh delete-licence.sed setup.py asn build-test.sh delete-licence.sh src build-doc.sh clean doc-src test.ini spl62 lepl:exit script done、file is typescript spl62 tmp:cat -v typescript スクリプトは6月9日(木)に開始されました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 スクリプトは木曜日09に完了しました2011年6月09:47:29 am clt spl62 tmp:col -b <typescript スクリプトは木曜日09に開始2011年6月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.sh0m 00mdelete-licence.sed0m 00msetup .py0m 01; 34masn0m 00; 32mbuild-test.sh0m 00; 32mdelete-licence.sh0m 01; 34msrc0m 00; 32mbuild-doc.sh0m 00; 32mclean0m 01; 34mdoc-src0m 00mtest.ini0m spl62 lepl:exit スクリプトは2011年6月9日木曜日09:47:29 am cltに作成されました
回答: 画面でscriptreplayを実行し、スクロールバックバッファーをファイルにダンプすることで問題を解決しました。次のexpectスクリプトはこれを行います。最大250.000行のログファイルでテストされています。作業ディレクトリには、スクリプトログ、「time」と呼ばれるファイル、その行の「1 10」の10.000.000倍のファイル、およびスクリプトが必要です。 ./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 時間ファイルは、for i in $(seq 1 10000000); do echo "1 10" >> time; done