2011-08-22 23 views
7

私はscriptコマンドを使用して対話型シェルセッションを記録しようとしていますので、ドキュメンテーションの準備に使用できます。 manページによると 形式:バックスペース、改行、削除された文字を削除しますか?

スクリプトは改行と
バックスペースを含め、ログファイルにすべてを配置します。これは、純粋なユーザーが期待するものではありません。

私はナイーブなユーザーです(マニュアルページでは大したことはありませんが、エキサイティングです)、バックスペース、改行、削除された文字などを出力するように処理したいのですがonは削除されます。私は少ないを使用するときには、私が見

stew:~> cat scriptsession.log 
Script started on Mon 22 Aug 2011 03:00:35 PM EDT 
stew:~> date 
Mon Aug 22 15:00:37 EDT 2011 
stew:~> #extra chars: that 
stew:~> exit 
exit 

Script done on Mon 22 Aug 2011 03:01:01 PM EDT 

:その後、私はは猫セッションログを読み取るために使用

stew:~> script -f scriptsession.log 
Script started, file is scriptsession.log 
stew:~> date 
Mon Aug 22 15:00:37 EDT 2011 
stew:~> #extra chars: that 
stew:~> exit 
exit 
Script done, file is scriptsession.log 

たとえば、私はスクリプトセッションを実行します

を使用して、表示されない不要な文字の証拠
stew:~> less scriptsession.log 
Script started on Mon 22 Aug 2011 03:00:35 PM EDT 
stew:~> date 
Mon Aug 22 15:00:37 EDT 2011 
stew:~> #extra chars: thiESC[ESC[ESC[ESC[Kthat 
stew:~> exit 
exit 

Script done on Mon 22 Aug 2011 03:01:01 PM EDT 
scriptsession.log lines 1-8/8 (END) 

私はを使用する場合、私はそれが見えない文字を削除しません、それだけで目に見えて、それらを表すものではないことを理解し、少ないようがありません - Iパイプので、もし出力ファイルには、依然として不要な文字が含まれています。

私が好きな出力フォーマットは何ディスプレイのコピーです。ありがとう!

(これが重複している場合、検索「UNIXスクリプトの出力形式は」手元に質問に対するノイズの結果の多くを返す謝罪!)

+3

1によって生成することができる時間。 :-) –

答えて

4

colコマンドは、いくつかの操作を行い、すべてではない、のだろうあなたが探しているフィルタリング。 (例えば太字と下線の制御シーケンスを認識していないようです)

これまで私が使ってきたアプローチは、(a)シェルプロンプトを変更してハイライト表示をしないようにすることです(通常は)、そして/または(b)$TERM"dumb"に設定すると、さまざまなコマンドが特定の制御シーケンスを使用しようとしません。

2

Keithが述べたように、colはジョブの一部(制御文字)を処理します。

あなたは、さらにあなたがしたくない任意のANSIエスケープシーケンス削除する ansifilterを使用することができます

http://www.andre-simon.de/zip/download.html#ansifilter

2

をそれとも、それらの文字を解釈し、あなたが入力した正確に何が表示されます「もっと」コマンドを使用することができ、受信しましたあたかもバッファー内をスクロールしたかのように出力として出力されます。

+0

絶対に動かない: '\ r'と'^H'がデータに残っています。 – Salamandar

4

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 
関連する問題