2011-08-22 10 views
7

मैं एक इंटरैक्टिव शैल सत्र रिकॉर्ड करने के लिए script कमांड का उपयोग करने का प्रयास कर रहा हूं ताकि मैं इसे दस्तावेज़ तैयार करने के लिए उपयोग कर सकूं।स्वरूप आउटपुट: बैकस्पेस, लाइनफ़ीड्स और हटाए गए वर्ण हटाएं?

आदमी पृष्ठ के अनुसार:

स्क्रिप्ट लॉग फ़ाइल में सब कुछ देता है, linefeeds और
backspaces भी शामिल है। यह मूर्खतापूर्ण उपयोगकर्ता की अपेक्षा नहीं करता है।

मैं अनुभवहीन उपयोगकर्ता हूँ (आमतौर पर आदमी पन्नों में एक चिल्लाओ बाहर नहीं मिलता है, यह नहीं बल्कि रोमांचक है!), और मैं उत्पादन पर कार्रवाई करने के लिए करना चाहते हैं ताकि backspaces, linefeeds और नष्ट कर दिया पात्रों और इतने हटा दिए गए हैं।

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:~> 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:~> 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

के लिए "मैं अनुभवहीन उपयोगकर्ता हूँ" +1 उत्पन्न किया जा सकता। :-) –

उत्तर

4

col आदेश कुछ करना होगा, लेकिन सभी नहीं, की फ़िल्टरिंग आप ढूंढ रहे हैं। (उदाहरण के लिए बोल्ड और अंडरलाइनिंग के लिए नियंत्रण अनुक्रमों को पहचानना प्रतीत नहीं होता है।)

अतीत में मैंने जो दृष्टिकोण देखा है वह है (ए) मेरा खोल प्रॉम्प्ट बदलें ताकि यह कोई हाइलाइटिंग न हो (यह सामान्य रूप से करता है), और/या (बी) $TERM"dumb" पर सेट करें ताकि विभिन्न आदेश कुछ नियंत्रण अनुक्रमों का उपयोग करने की कोशिश न करें।

2

जैसा कि किथ द्वारा उल्लेख किया गया है, col नौकरी (नियंत्रण वर्ण) का हिस्सा है।

आप आगे ansifilter किसी भी एएनएसआई भागने दृश्यों है कि आप नहीं चाहते हैं दूर करने के लिए उपयोग कर सकते हैं: http://www.andre-simon.de/zip/download.html#ansifilter

2

या आप "अधिक" आदेश का उपयोग कर सकते हैं, जो उन अक्षरों की व्याख्या करेगा और प्रदर्शित आप वास्तव में क्या लिखा हो, प्राप्त आउटपुट के रूप में, आदि, जैसे कि आप अपने बफर में वापस स्क्रॉल करते हैं।

+0

यह बिल्कुल काम नहीं करता है: डेटा में '\ r' और'^H' छोड़े गए हैं। – Salamandar

4

मैंने स्क्रीन में scriptreplay चलाकर और स्क्रॉलबैक बफर को फ़ाइल में डंप करके समस्या हल की।

निम्न उम्मीद स्क्रिप्ट आपके लिए यह करती है।

यह 250,000 लाइनों के साथ लॉगफाइल के लिए परीक्षण किया गया है। कार्यशील निर्देशिका में आपको अपनी स्क्रिप्टॉग की आवश्यकता होती है, जिसमें "टाइम" नामक एक फ़ाइल है जिसमें 10.000.000 बार लाइन "1 10" और स्क्रिप्ट है। मुझे कमांड लाइन तर्क के रूप में आपकी स्क्रिप्टफ़ाइल के नाम की आवश्यकता है, जैसे ./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 
संबंधित मुद्दे