कमांड का आउटपुट बश में उपलब्ध लाइनों की संख्या को सीमित करने के लिए कैसे?


11

मैंने उपयोग करते हुए पृष्ठभूमि में एक बड़ी फ़ाइल डाउनलोड करना शुरू कर दिया

$ nohup wget http://example.tld/big.iso &

जो मुझे एक nohup.outफाइल भी देता है जिसमें शामिल है आउटपुट wget

अब, अगर मैं बाद में डाउनलोड करने की प्रक्रिया को देखना चाहता हूं, तो मैं उपयोग कर सकता हूं, $ tail -f nohup.outलेकिन मैं अपनी इच्छा के मुकाबले अपनी टर्मिनल विंडो को तेजी से भरता हूं। मैं जो देखना चाहता हूं वह है अंतिम पंक्ति लगातार अपडेट करना (जैसे wgetअकेले उपयोग करते समय )।

मैंने कोशिश की $ tail -n 1 -f nohup.outलेकिन यह केवल शुरुआती टेलिन को प्रभावित करता है। '

सामान्यतया, यदि यह (इस मामले में 1 तक) सीमित करने के लिए संभव है तो कमांड की आउटपुट की पंक्तियों की संख्या उपलब्ध / दृश्य है जो इस समस्या को हल करेगी। एक परिपत्र बफ़र में आउटपुट होने की तरह - बस सामान्य प्रगति पट्टी के बारे में सोचें $ wget example.tld/big.iso

क्या ऐसा कोई उपाय है?

या मैं गलत तरीके से पेड़ पर चढ़ रहा हूं? (मतलब, क्या nohupआउटपुट को सीमित करना या कुछ और करना आसान होगा ?)

जवाबों:


10

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

nohup wget http://cdimage.debian.org/debian-cd/6.0.3/amd64/iso-dvd/debian-6.0.3-amd64-DVD-1.iso &
el="$(tput el)"; # Clear to the end of the line
tail -n 1 -f nohup.out | while read -r line; do echo -n $'\r'"$el$line"; done;

6

आप watchयहाँ उपयोग कर सकते हैं :

watch -n 0.5 -e "tail -n 1 nohup.out"

संपादित करें : -e(उपनाम --exec) विकल्प यहां उपयुक्त लगता है। विशेष रूप से यदि आप watchबहुत छोटे अंतराल के साथ चलने का लक्ष्य रखते हैं, तो यह प्रत्येक चक्र में sh -cआंतरिक रूप से चलने के कारण होने वाले ओवरहेड को कम करता watchहै।


2
ध्यान दें कि यह tailहर सेकंड एक नई प्रक्रिया को जन्म देता है , जो आपके बारे में परवाह किए बिना कुछ हो सकता है या नहीं। इसके अलावा, watch -n 0.1"लगातार अद्यतन" भाग को अनुकरण करने के लिए एक उप-दूसरा अंतराल (जैसे ) निर्दिष्ट करना सुनिश्चित करें । (यह स्पष्ट रूप से प्रक्रियाओं की संख्या बढ़ाता है और खुली कॉल भी दर्ज करता है।) अंत में, यदि आप OS X का उपयोग कर रहे हैं, तो आप watchMacPorts से प्राप्त कर सकते हैं , क्योंकि यह डिफ़ॉल्ट रूप से उपलब्ध नहीं है।
जन्मोसेन

यह थोड़ा वर्कअराउंड है, लेकिन इस तरह से बढ़िया है। मुझे गैर-फुलस्क्रीन उत्तर की उम्मीद थी, ताकि मैं पिछले आउटपुट देखूँ - लेकिन वास्तव में मैं watchएक नई टर्मिनल विंडो में उपयोग कर सकता हूं । मैं भी पता चला कि का उपयोग कर tail -n 2अधिक से अधिक उपयोगी है -n 1के साथ wgetकम से कम के साथ, watch, 1 सेकंड के अंतराल क्योंकि अन्यथा नवीनतम प्रतिशत नहीं देखा जा सकता है, यह आपके उत्तर में कोई दोष नहीं है, लेकिन मैंने इसका उल्लेख किया है कि यदि कोई अन्य व्यक्ति किसी भी तरह से रस्सा कसी हुई घड़ी देखने का फैसला करता है।
जरी कीनलेन

@janmoesen इस विशिष्ट परिदृश्य के लिए, एक नई tailप्रक्रिया होने से शायद बहुत ज्यादा ओवरकिल नहीं है; लेकिन एक सामान्य जवाब के रूप में यह ध्यान में रखना अच्छा है। मैंने यह भी कहा कि watch -n 0.1काम नहीं किया है, लेकिन watch -n 0,1काम किया - वहाँ लागू स्थानों हो सकता है, हालांकि मैंने पहले टर्मिनल आदेश विकल्पों के लिए लागू स्थानों को नहीं देखा है। एक साइड नोट के रूप में: brew install watchमहान के रूप में अच्छी तरह से काम किया :-)
जरी कीनलेन

एक साइड नोट: क्या आपके स्थानीय सेटिंग्स के watchसाथ काम करेगा 0,1या 0.1निर्भर करेगा (यह आपके लोकेल के लिए परिभाषित दशमलव प्रतीक का उपयोग करता है)। जाँच करें LC_ALL=C watch -n 0.1 "date +%S.%N"
rozcietrzewiacz

3

कुछ Xterm कंट्रोल सीक्वेंस हैं जिनका उपयोग आप अपने टर्मिनल की लाइनों को स्क्रॉल करने के लिए कर सकते हैं। "स्क्रॉलिंग क्षेत्र सेट करें" देखें। यह एक कीचड़ का एक सा है, यद्यपि। अपने टर्मिनल को बाद में रीसेट करना सुनिश्चित करें:

nohup wget http://cdimage.debian.org/debian-cd/6.0.3/amd64/iso-dvd/debian-6.0.3-amd64-DVD-1.iso &
clear; echo -n $'\e[1;2r'; tail -f nohup.out | grep --line-buffered .
# The "grep" line is to ensure a single line; you can also use "awk 1" or "sed" etc.

<गैर-पोर्टेबिलिटी के बारे में सामान्य नोट यहां डालें>
जंमोसन

यह एक और बढ़िया विकल्प है, लेकिन एक यह भी समर्पित विंडो में सबसे अच्छा उपयोग किया जाता है क्योंकि tail -fअभी भी बफर भरता है और इसलिए भी क्योंकि टर्मिनल को फिर से रीसेट करने की आवश्यकता है। यह इनलाइन के रूप में के रूप में मुझे आशा नहीं थी, लेकिन अन्यथा यह हो सकता है कि मैं क्या मांग रहा हूं।
जरी कीनलेन

0

यदि आप संपूर्ण वर्तमान टर्मिनल विंडो पर आउटपुट नहीं चाहते हैं, तो आप एक साधारण whileलूप का उपयोग कर सकते हैं :

while true; do 
  XXX=$( tail -n1 my.log )
  echo -en " \r$XXX\r"
  sleep 0.5
done; echo

1
ध्यान दें कि टर्मिनल आउटपुट को स्क्रॉल करने में सक्षम होने के दौरान कोई भी आउटपुट-उत्पादक कमांड चल रहा है, आपको अपनी टर्मिनल एमुलेटर सेटिंग्स को एडिट करने की आवश्यकता है और scrollTtyOutput(या समान) विकल्प को अक्षम करना होगा ।
rozcietrzewiacz
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.