I solved the problem by running scriptreplay in a screen and the dumping the scrollback buffer to a file.
The following expect script does this for you.
It has been tested for logfiles with up to 250.000 lines. In the working directory you need your scriptlog, a file called "time" with 10.000.000 times the line "1 10" in it, and the script. I needs the name of your scriptfile as command line argument, like ./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 The time file can be generated by
for i in $(seq 1 10000000); do echo "1 10" >> time; done