cat <<EOS | sed -ne '1{h;d;}' -e 'H;${G;p;}'
line 1
line 2
line 3
EOS
इसका उपयोग करने वाली किसी चीज़ के लिए अनुवाद करने के साथ समस्या यह tailहै कि tailइसके अंत का पता लगाने के लिए पूरी फ़ाइल को पढ़ने की आवश्यकता है। अपनी पाइपलाइन में इसका उपयोग करने के लिए, आपको इसकी आवश्यकता है
- दस्तावेज़ की पूरी सामग्री प्रदान करें
tail।
- इसे फिर से प्रदान करें
cat।
- उस क्रम में।
ट्रिकी बिट डॉक्यूमेंट के कंटेंट को डुप्लिकेट नहीं teeकरता ( ऐसा करता है), लेकिन tailबाकी डॉक्यूमेंट को आउटपुट करने से पहले होने वाले आउटपुट को पाने के लिए, बिना इंटरमीडिएट अस्थायी फाइल का उपयोग किए।
प्रयोग sed(या awk, जैसा कि जॉन 1024 करता है ) डेटा के दोहरे पार्सिंग और मेमोरी में डेटा को संग्रहीत करके आदेश जारी करने से छुटकारा दिलाता है ।
sedसमाधान है कि मैं प्रस्ताव करने के लिए है
1{h;d;}, पहली पंक्ति को होल्ड स्पेस में स्टोर करें, जैसा कि है, और अगली लाइन पर जाएं।
H, एक नई लाइन के साथ पकड़ स्थान के लिए एक दूसरे को लाइन में जोड़ें।
${G;p;}, अंतिम स्थान को एक एम्बेडेड न्यूलाइन के साथ अंतिम पंक्ति में जोड़ें और परिणामी डेटा को प्रिंट करें।
यह जॉन 1024 के समाधान का काफी शाब्दिक अनुवाद है sed, इस चेतावनी के साथ कि POSIX मानक केवल यह गारंटी देता है कि पकड़ स्थान कम से कम 8192 बाइट्स (8 KiB) पर है, लेकिन यह अनुशंसा करता है कि यह बफर गतिशील रूप से आवंटित और आवश्यकतानुसार विस्तारित हो, जो दोनों GNU है। sedऔर बीएसडी sedकर रहा है)।
यदि आप अपने आप को नामित पाइप का उपयोग करने की अनुमति देते हैं:
mkfifo mypipe
cat <<EOS | tee mypipe | cat <( tail -n 1 mypipe ) -
line 1
line 2
line 3
EOS
rm -f mypipe
यह teeडेटा को नीचे mypipeऔर उसी समय भेजने के लिए उपयोग करता है cat। catउपयोगिता पहले से उत्पादन पढ़ा जाएगा tail(जिसमें से पढ़ता है mypipe, जो teeकरने के लिए लिख रहा है), और फिर दस्तावेज़ से सीधे आने की प्रतिलिपि संलग्न tee।
हालांकि इसमें एक गंभीर दोष है, कि अगर दस्तावेज़ बहुत बड़ा है (पाइप के बफर आकार से बड़ा), तो teeलिखने के लिए mypipeऔर cat(अनाम) पाइप को खाली करने के लिए इंतजार करते समय ब्लॉक होगा। इसे तब तक खाली नहीं किया जाएगा जब तक catकि इसे पढ़ा नहीं जाता। समाप्त catहोने तक इसे नहीं पढ़ा जा सकेगा tail। और tailतब तक खत्म नहीं होगा जब तक खत्म नहीं teeहो जाता। यह एक क्लासिक गतिरोध की स्थिति है।
भिन्नता
tee >( tail -n 1 >mypipe ) | cat mypipe -
एक ही मुद्दा है।