लिनक्स 'स्क्रिप्ट' कमांड के आउटपुट को कैसे साफ करें


35

मैं कुछ संवादात्मक सत्रों को ट्रैक करने के लिए linux 'script' कमांड का उपयोग कर रहा हूं http://www.linuxcommand.org/man_pages/script1.html । उस से आउटपुट फ़ाइलों में मेरे बैकस्पेस कीस्ट्रोक सहित अनपेक्षित वर्ण होते हैं।

वहाँ इन आउटपुट फ़ाइलों को साफ करने का एक तरीका है ताकि वे केवल स्क्रीन पर प्रदर्शित किया गया हो?

या एक इंटरैक्टिव शेल सत्र (इनपुट और आउटपुट) रिकॉर्ड करने का एक और तरीका है?


"या एक इंटरैक्टिव शेल सत्र (इनपुट और आउटपुट) रिकॉर्ड करने का एक और तरीका है?" क्या आप asciinema.org जानते हैं ?
मास्टरएक्सिलो

जवाबों:


34

यदि आप फ़ाइल देखना चाहते हैं, तो आप आउटपुट को भेज सकते हैं col -bp; यह नियंत्रण वर्णों की व्याख्या करता है। फिर आप कम के माध्यम से पाइप कर सकते हैं, यदि आप चाहें।

col -bp typescript | less -R

कुछ सिस्टम colफ़ाइल नाम तर्क को स्वीकार नहीं करेंगे, इस सिंटैक्स का उपयोग करें:

col -bp <typescript | less -R

1
मेरे सिस्टम पर, colएक फ़ाइल नाम स्वीकार नहीं करेगा, इसलिए मैंने किया col -bp < typescript और मुझे जो चाहिए था, वह मिला।
एंड्रयू

मेरे लिए काम नहीं करता है, आउटपुट में से कुछ को रगड़ता है।
एलेक्स

1
अपने सिस्टम पर पहले के less -Rमाध्यम से पाइपिंग की तुलना में बेहतर उत्पादन प्रदान करता है col -bp
ब्रायन हॉकिंस

@BrianHawkins मैं सम्‍मिलित हूं। रंग का उपयोग col -bp <typescript | less -Rकंसोल प्रदर्शित नहीं करता है। रंग का उपयोग less -R typescriptसांत्वना प्रदर्शित करता है!
ट्रेवर बॉयड स्मिथ

यह तभी अच्छा है जब आप स्क्रिप्ट को अंतःक्रियात्मक रूप से देखना चाहते हैं less
ट्रेवर बॉयड स्मिथ

18
cat typescript | perl -pe 's/\e([^\[\]]|\[.*?[a-zA-Z]|\].*?\a)//g' | col -b > typescript-processed

यहाँ स्ट्रिंग इनपुट की कुछ व्याख्या है perl:

  • s/pattern//gसंपूर्ण पर एक प्रतिस्थापन gकरने का अर्थ है ( विकल्प का अर्थ है कि संपूर्ण कार्य पहले स्थानापन्न पर रुकने के बजाय) इनपुट स्ट्रिंग

यहाँ रेगेक्स पैटर्न की कुछ व्याख्या है:

  • \e विशेष "एस्केप" नियंत्रण चरित्र से मेल खाएं (ASCII 0x1A)
  • (और )एक समूह की शुरुआत और अंत हैं
  • |इसका मतलब है कि समूह एक एन पैटर्न से मेल खा सकता है। जहां एन पैटर्न हैं
    • [^\[\]] या
    • \[.*?[a-zA-Z] या
    • \].*?\a
  • [^\[\]] माध्यम
    • उन वर्णों के समूह से मिलान करें जहां वर्ण नहीं हैं [और]
  • \[.*?[a-zA-Z] माध्यम
    • [तब से शुरू होने वाले एक तार से मेल खाते हैं .*?, पहले अल्फा वर्ण तक एक गैर-लालची करते हैं
  • \].*?\a माध्यम
    • ]तब से शुरू होने वाले एक तार से मेल खाते हैं .*?जब तक कि आप "एलर्ट" (घंटी का पात्र) नामक विशेष नियंत्रण चरित्र को हिट न करें

1
मुझे अभी भी यह पता लगाने की ज़रूरत है कि यह कैसे काम करता है;)
asdmin

@asdmin - मूल रूप से, यह typescriptएक perlप्रोग्राम के आउटपुट को गूँजता है जो आउटपुट से कुछ नियंत्रण वर्णों को निकालता है, फिर आउटपुट को यूनिक्स colकमांड पर पाइप करता है , जिसका -bविकल्प ट्रांसक्रिप्ट में किसी भी "डिलीट" कुंजी कलाकृतियों को हटा देता है। इसके बाद आउटपुट को टेक्स्ट फाइल में पाइप करता है।
पीटर नूर

यह मेरे लिए टाइपस्क्रिप्ट की पहली पंक्ति में आउटपुट को स्क्रैम्बल करता है लेकिन सबसे अच्छा उत्तर है।
एलेक्स

यह कुछ प्रकार के साथ बहुत अच्छी तरह से काम करने लगता है; यह निश्चित रूप से स्वीकृत उत्तर द्वारा उत्पादित आउटपुट की तुलना में अधिक पठनीय है।
फेकैडेड

महान जवाब!
zack

2

बड़ी मात्रा में scriptआउटपुट के लिए, मैं एक पर्ल स्क्रिप्ट को एक साथ पुनरावृति से हैक करूंगा। अन्यथा किसी अच्छे संपादक के साथ हाथ मिलाएं।

scriptआउटपुट से नियंत्रण वर्णों को हटाने का एक मौजूदा स्वचालित तरीका होने की संभावना नहीं है जो कुछ महत्वपूर्ण क्षणों में स्क्रीन पर प्रदर्शित किए गए तरीके को पुन: पेश करता है (जैसे कि जब होस्ट कुछ उपयोगकर्ता इनपुट के उस पहले चरित्र की प्रतीक्षा कर रहा था )।

उदाहरण के लिए स्क्रीन खाली हो सकती है Andrew $, यदि आप तब टाइप करते हैं rm /*और बैकस्पेस बारह बार दबाया जाता है (जरूरत से ज्यादा), तो स्क्रीन पर जो दिखाई देता है, उसके अंत में जो शेल चल रहा था, उस पर निर्भर करता है कि आपकी वर्तमान sttyसेटिंग्स क्या हैं ( जिसे आप एक सत्र के माध्यम से बदल सकते हैं) और शायद कुछ अन्य कारक भी।

उपरोक्त इनपुट और आउटपुट को लगातार कैप्चर करने की किसी भी स्वचालित विधि पर लागू होता है। मुख्य विकल्प "स्क्रीन शॉट्स" ले रहा है या सत्र के दौरान उपयुक्त समय पर स्क्रीन को काटने और चिपकाने (जो कि मैं उपयोगकर्ता गाइडों के लिए करता हूं, एक दिन-लॉग के लिए नोट्स, आदि)।



2

मैं cat filenameजो नियंत्रण पात्रों को हटाता था :-)


imo यह एक अच्छा जवाब है, क्योंकि यह वास्तव में सभी नियंत्रण वर्णों को हटा देता है ।
नाथानेल फ़ार्ले

OSX पर, बिल्ली रंग नियंत्रण वर्णों को नहीं
निक

9
वास्तव में बिल्ली नियंत्रण पात्रों को बिल्कुल भी नहीं हटाती है, बल्कि यह उन्हें शब्दशः आउटपुट करती है, और फिर टर्मिनल उनकी व्याख्या करता है। यदि आपका टाइपस्क्रिप्ट आपके टर्मिनल बफर के सापेक्ष छोटा है और आप टर्मिनल से कॉपी और पेस्ट कर सकते हैं तो यह आपके लिए काम कर सकता है। यदि आपका टाइपस्क्रिप्ट बड़ा है, तो इतना अच्छा नहीं है।
mc0e

1
माना। यह कुछ भी नहीं निकालता है। यह केवल शेल को उनकी व्याख्या करने की अनुमति देता है। वे अभी भी मौजूद हैं।
केंटग्राव

2

यदि आप इसके बाद क्या कर रहे हैं तो आपकी आज्ञाओं को रिकॉर्ड करना है (जैसे बाद में उन्हें बैश स्क्रिप्ट में बदल दें), तो एक उचित हैक को चलाना है script(1), फिर इसे अंदर चलाना है

bash -x

बाद grepमें आउटपुट फ़ाइल (आमतौर पर "टाइपस्क्रिप्ट") "+" से शुरू होने वाली लाइनों की तलाश में है। नियमित अभिव्यक्ति ^\+ट्रिक करेगी।


2

यदि आप फ़ाइल में आउटपुट लिखना चाहते हैं:

col -bp < typescript >>newfile

यदि आप चाहें तो फ़ाइल को विंडोज प्रारूप में बदलने के लिए unix2dos कमांड का उपयोग करें


1
उबंटू 14.04 पर, यह लाइनों की शुरुआत और अंत में बहुत सारे कबाड़ में छोड़ देता है। काफी पठनीय, लेकिन वास्तव में साफ नहीं।
mc0e

2

colb -bp बैकस्पेस को वांछित (AFAIK) के रूप में संसाधित करता है। लेकिन यह रंग से बचने के दृश्यों का प्रबंधन करता है। रंग अनुक्रमों को पहले निकालना अच्छा हो सकता है, फिर यदि संभव हो तो बैकस्पेस को संसाधित करें।

यह एक बहुत ही सामान्य आवश्यकता है, और मुझे आश्चर्य है कि इसके अधिक समाधान नहीं हैं। सत्र की स्क्रिप्ट करना बेहद सामान्य है, फिर किसी को प्रक्रिया की समीक्षा करने की आवश्यकता है। आप भविष्य की संदर्भ के लिए प्रक्रिया की "स्वच्छ" स्क्रिप्ट बनाने के लिए सभी छोटी टाइपिंग गलतियों को खत्म करना चाहते हैं, और रंग से बचना चाहते हैं। सरल ASCII पाठ को प्राथमिकता दी गई। मुझे लगता है कि यह "मानव पठनीय" द्वारा अभिप्रेत है, और ऐसा करना बहुत ही उचित बात है।


1

मुझे जवाब मिला कि डिंकटेल ने यूनिक्स बोर्ड पर इसी तरह के प्रश्न को प्रदान किया था, यदि आप एक ऐसे वातावरण में हैं जहां पर्ल आपके लिए उपलब्ध है, तो स्क्रिप्ट के आउटपुट से नियंत्रण वर्ण हटाने में अधिक प्रभावी होगा।

डेवटल की स्क्रिप्ट:

#!/usr/bin/perl
while (<>) {
    s/ \e[ #%()*+\-.\/]. |
       \r | # Remove extra carriage returns also
       (?:\e\[|\x9b) [ -?]* [@-~] | # CSI ... Cmd
       (?:\e\]|\x9d) .*? (?:\e\\|[\a\x9c]) | # OSC ... (ST|BEL)
       (?:\e[P^_]|[\x90\x9e\x9f]) .*? (?:\e\\|\x9c) | # (DCS|PM|APC) ... ST
       \e.|[\x80-\x9f] //xg;
       1 while s/[^\b][\b]//g;  # remove all non-backspace followed by backspace
    print;
}

नियंत्रण वर्ण हटाने के लिए:

./dewtalls-script.pl < output-from-script-that-needs-control-characters-removed

1

इस समस्या को हल करने के लिए https://github.com/RadixSeven/typescript2txt लिखा गया था।

यह 4 साल हो गया है जब मैंने इसे अंतिम रूप से अपडेट / उपयोग किया है, लेकिन मुझे कुछ भी फैंसी करने की याद नहीं है जो आज भी काम नहीं करना चाहिए।


0

मुझे इसे करने का एक अच्छा तरीका मिला। मेरे सिस्टम पर, "^ M" के साथ लंबी आउटपुट लाइनें बिछाई जाती हैं (रिक्त स्थान जिसके बाद गाड़ी वापसी होती है)। "^ M" को अच्छी तरह से अशक्त चरित्र "^ @" के साथ बदल दिया जा सकता है, जो फ़ाइल को बिल्ली करते समय बिल्कुल भी प्रदर्शित नहीं करता है।

मैं समय को भी कैप्चर करता हूं, इसलिए फ़ाइल को पूरी तरह से रीप्ले करने के लिए, मैं नीचे दिए गए आदेशों का उपयोग करके "^ M" को पूरी तरह से हटा नहीं सकता हूं (क्योंकि स्क्रिप्ट्रेप बाइट्स गिनता है):

tr '\r' '\0' | sed 's/ \x0//g'

मैं अपनी स्क्रिप्ट कमांड इस तरह से चलाता हूं:

script -t -f session.log 2>timing

तो, मैं इसके बाद क्या करता हूं:

cat session.log | tr '\r' '\0' > typescript 
scriptreplay -t timing | sed 's/ \x0//g'

पहला संपादन (रीप्ले से पहले) फ़ाइल में बाइट्स की संख्या को बरकरार रखता है। दूसरा संपादन (रिप्ले के बाद) यादृच्छिक स्थानों में सफेद स्थान से छुटकारा दिलाता है। (ध्यान दें कि डिफ़ॉल्ट स्क्रिप्टरेप्ले में "टाइपस्क्रिप्ट" नाम की इनपुट फ़ाइल दिखती है, यही वजह है कि मैंने इसे "टाइमिंग" के बाद प्रदान नहीं किया।)


-1

आउटपुट पर dos2unix भी ट्रिक करेगा


7
क्या आप बता सकते हैं कि कार्य को पूरा करने के लिए इसका उपयोग कैसे किया जाए?
बेन एन

-1

एक अन्य उपाय यह है कि stringsएक फ़ाइल (या मानक इनपुट से) प्रिंट करने योग्य वर्णों का उपयोग करने के लिए :

strings -n 1 filename

-n 1विकल्प दृश्यों से एक के लिए संरक्षित करने की न्यूनतम अवधि सेट और इस तरह यकीन है कि यहां तक कि एक प्रिंट करने योग्य प्रिंट न हो सकने पात्रों से घिरा हुआ पात्रों संरक्षित कर रहे हैं बनाता है।

इस दृष्टिकोण का एक संभावित नकारात्मक पहलू यह है कि stringsमुद्रण योग्य वर्णों के सन्निहित तारों के बीच की रेखा टूट जाती है। उदाहरण के लिए, सामग्री वाली फ़ाइल

Foo<SOMECONTROLCHAR>Bar

(जहां <SOMECONTROLCHAR>नियंत्रण चरित्र या कोई अन्य गैर-मुद्रण योग्य चरित्र है) को वापस कर दिया जाएगा

Foo
Bar

टिप्पणियों में लाया गया एक और मुद्दा यह है कि नियंत्रण वर्णों के कुछ अनुक्रमों में मुद्रण योग्य और गैर-मुद्रण योग्य वर्णों के संयोजन होते हैं और यह दृष्टिकोण केवल उन लोगों के हिस्से को हटा देगा।

हालांकि, stringsसवाल में उल्लिखित बैकस्पेस की तरह नियंत्रण पात्रों को हटाने का एक अच्छा काम करता है।


stringsसभी गैर-मुद्रण योग्य वर्णों को नहीं हटाता है। यह प्रिंट करने योग्य पात्रों के दृश्यों की पहचान करता है और प्रिंट करता है । वह वैसी बात नहीं है।
बजे एक CVn

@ माइकलकॉर्जलिंग, आप सही कह रहे हैं, डिफ़ॉल्ट रूप से stringsकेवल 4. की न्यूनतम लंबाई के दृश्यों को प्रिंट करता है। मैंने -n 1विकल्प को जोड़कर अपने उत्तर को सही कर लिया है जो न्यूनतम लंबाई सेट करता है। 1. इसे इंगित करने के लिए धन्यवाद।
justfortherec

जवाब अभी भी वही दावा करता है जो stringsसभी गैर-मुद्रण योग्य वर्णों को हटा देता है, इसलिए यह अभी भी उसी तरह से गलत है जैसे यह संपादन से पहले था। यह भी स्पष्ट रूप से टूट गया है क्योंकि "कुछ रंग कोड" (और सामान्य रूप से नियंत्रण कोड) में अक्सर मुद्रण योग्य और गैर-मुद्रण योग्य दोनों वर्ण होते हैं। उदाहरण के लिए, टेक्स्ट कलर को बदलने के लिए एक कंट्रोल कोड अनुक्रम हो सकता है ESC[01;52mजहां ESCसिंगल एस्केप कैरेक्टर (बाइट वैल्यू 27) है। stringsजैसा कि आप सुझाव देते [01;52mहैं कि आउटपुट में उपयोग करना , जो अर्थहीन है।
बजे एक CVn

अच्छी बात है, @ माइकलकॉर्जलिंग। विशेष रूप से रंग कोड के साथ उदाहरण बहुत दुर्भाग्यपूर्ण था। मेरे उत्तर को बेहतर बनाने में मेरी मदद करने के लिए धन्यवाद। क्या संपादन आपकी चिंताओं को उचित रूप से संबोधित करते हैं? stringsकुछ अन्य उत्तरों के समान काम नहीं कर सकते हैं, लेकिन IMHO प्रश्न में वर्णित समस्या को हल करने के लिए एक वैध दृष्टिकोण है।
justfortherec
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.