2011-08-22 11 views
7

Tôi đang cố gắng sử dụng lệnh script để ghi lại phiên trình diễn tương tác để tôi có thể sử dụng nó để chuẩn bị tài liệu.định dạng đầu ra từ lệnh "script" Unix: loại bỏ các không gian, dòng dữ liệu và ký tự bị xóa?

theo man page:

Script đặt tất cả mọi thứ trong file log, bao gồm linefeeds và
backspaces. Đây không phải là những gì người dùng ngây thơ mong đợi.

Tôi là người dùng ngây thơ (thường không có tiếng hét trong trang người đàn ông, điều này khá thú vị!) Và tôi muốn xử lý đầu ra sao cho không gian, đường truyền và ký tự đã xóa trên bị xóa.

Ví dụ, tôi chạy một kịch bản phiên:

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 

sau đó tôi sử dụng mèo để đọc các bản ghi session:

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 

nhưng khi tôi sử dụng ít, tôi thấy bằng chứng về các ký tự không mong muốn vô hình bằng cách sử dụng cat:

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) 

khi tôi sử dụng mèo, tôi hiểu rằng nó không loại bỏ các ký tự vô hình, nó chỉ không đại diện cho họ rõ ràng, giống như ít không - vì vậy nếu tôi ống các mèo đầu ra vào một tệp, nó vẫn có các ký tự không mong muốn.

định dạng đầu ra tôi muốn là một bản sao của những gì mèomàn. cảm ơn!

(xin lỗi nếu điều này là một bản sao, tìm kiếm "unix định dạng đầu ra kịch bản" trả về rất nhiều kết quả tiếng ồn đối với các câu hỏi trong tầm tay với!)

+3

+1 cho "Tôi là người dùng ngây thơ". :-) –

Trả lời

4

Lệnh col sẽ làm một số người, nhưng không phải tất cả, của lọc bạn đang tìm kiếm. (Ví dụ, dường như không nhận ra các chuỗi điều khiển cho chữ in đậm và gạch dưới)

Cách tiếp cận mà tôi đã sử dụng trong quá khứ là (a) thay đổi dấu nhắc trình bao của mình để nó không làm nổi bật gì (bình thường), và/hoặc (b) đặt $TERM thành "dumb" vì vậy các lệnh khác nhau sẽ không cố gắng sử dụng các chuỗi điều khiển nhất định.

2

Như đã đề cập bởi Keith, col thực hiện một phần công việc (các ký tự điều khiển).

Bạn có thể tiếp tục sử dụng ansifilter để loại bỏ bất kỳ trình tự thoát ANSI mà bạn không muốn: http://www.andre-simon.de/zip/download.html#ansifilter

2

Hoặc bạn có thể sử dụng lệnh "nhiều hơn", mà sẽ giải thích những ký tự và hiển thị chính xác những gì bạn đã gõ, đã nhận như đầu ra, vv, như thể bạn đã cuộn lại trong bộ đệm của bạn.

+0

Nó hoàn toàn không hoạt động: '\ r' và'^H' được để lại trong dữ liệu. – Salamandar

4

Tôi đã giải quyết sự cố bằng cách chạy scriptreplay trên màn hình và bán bộ đệm cuộn lại cho tệp.

Tập lệnh mong đợi sau sẽ thực hiện điều này cho bạn.

Đã được thử nghiệm cho các tệp nhật ký có tối đa 250.000 dòng. Trong thư mục làm việc bạn cần scriptlog của bạn, một tập tin gọi là "thời gian" với 10.000.000 lần dòng "1 10" trong đó, và kịch bản. Tôi cần tên của tệp kịch bản lệnh của bạn dưới dạng đố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 
Các vấn đề liên quan