2011-08-22 3 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) 

, 나는 그것이 보이지 않는 문자를 제거하지 않습니다 이해, 그냥 하는 것처럼, 눈에 띄게을 나타내지 않는 파일에는 여전히 원치 않는 문자가 있습니다. 내가 좋아하는 것

출력 형식의 사본이 무엇인지 고양이표시. 감사!

(사과이 검색 "유닉스 스크립트 출력 형식"손 질문에 대한 소음 결과를 많이 반환!, 중복 된 경우)의 모든

+3

하나에 의해 생성 될 수있다. :-) –

답변

4

col 명령이 어떤 작업을 수행 할 수 있지만 당신이 찾고있는 필터링. (예를 들어, 굵은 글씨와 밑줄에 대한 제어 순서를 인식하지 못하는 것 같습니다.)

과거에 사용한 적이있는 접근 방법은 (ㄱ) 쉘 프롬프트를 변경하여 강조 표시를하지 않고 (일반적으로), 그리고/또는 (b) $TERM"dumb"으로 설정하면 다양한 명령이 특정 제어 순서를 사용하려고하지 않을 것입니다.

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 
관련 문제