प्रोग्राम sed
और awk
आमतौर पर उनके काम को चुपचाप करता है। क्या इन कार्यक्रमों को यह बताने का कोई तरीका है कि वे क्या कर रहे हैं?प्रिंटिंग वर्बोज़ प्रगति से sed और awk
उत्तर
आप एक फाइल करने के लिए sed
या awk
के उत्पादन रीडायरेक्ट कर रहे (के बजाय यथा-स्थान फ़ाइलों को संशोधित) आप pv
("पाइप दर्शक") एक शॉट देने के कर सकते हैं:
sed -e '...' input.txt | pv > output.txt
आप उपयोग कर सकते हैं pv -l
इसे लिखित लाइनों में प्रगति की रिपोर्ट करने के लिए। प्रगति की स्थिति stderr
पर मुद्रित हो जाती है जबकि वास्तविक डेटा क्रूज stdin
से stdout
तक होता है।
तुम हमेशा awk बता इनपुट रिकॉर्ड मुद्रित करने के लिए कर सकते हैं, अर्थात
awk '{
print "#dbg:$0="$0
# do more stuff
print $1
# or make it conditional
if ($0 ~ /specialRegEx/){
print "#dbg:$0="$0
}
}' infile
एसईडी के साथ
, आप 'पी' का उपयोग करें, प्रत्येक पंक्ति मुद्रित करने के लिए हालांकि, डिफ़ॉल्ट प्रत्येक पंक्ति मुद्रित करने के लिए है cmd।
sed 'p
# also "=" prints line # being processed
=
/specialRegEx/{
s/xxx/yyy/
p
}' infile
मुझे उम्मीद है कि इससे मदद मिलती है।
यह आपको (एसईडी के लिए) के लिए काम कर सकते हैं:
sed -i 's/foo/bar/;w /dev/stdout' files*
आप लिनक्स पर हैं, तो आप /proc/<pid>/fdinfo
में देख द्वारा प्रक्रिया है कि एक बड़ी फ़ाइलों को संसाधित कर रहा है की प्रगति देख सकते हैं। प्रत्येक खुली फ़ाइल डिस्क्रिप्टर के लिए वहां एक प्रविष्टि है, और यदि आप प्रविष्टियों को बिल्ली देते हैं, तो वे आपको फ़ाइल डिस्क्रिप्टर की पढ़ने/लिखने की स्थिति दिखाते हैं। तो आप देख सकते हैं कि आप फ़ाइल में 1123456
बाइट्स हैं। खुली फाइलों के पथ नाम किसी अन्य क्षेत्र में हैं: /proc/<pid>/fd
, सिम्लिंक के रूप में प्रतिनिधित्व किया जाता है।
इससे पहले कि मैं इसे देखूं, मैं आमतौर पर प्रक्रिया में strace
संलग्न करता हूं: strace -p <pid>
। आप यह देखने के लिए उपयोग कर सकते हैं कि कौन सी प्रणाली प्रक्रिया को कॉल कर रही है: फ़ाइल पढ़ती है और लिखती है, और brk
या mmap
के साथ मेमोरी आवंटन।
सुविधा के लिए: 'पीएस कुल्हाड़ी | grep foo' जहां 'foo' प्रश्न में प्रोग्राम का नाम उपरोक्त उपयोग के लिए प्रक्रिया आईडी खोजने के लिए उपयोग किया जा सकता है। –
इस धारणा पर कि आप फ़ाइल में अपने sed आउटपुट को पाइप कर रहे हैं, तो आप फाइल के अंत को लगातार देखने के लिए पूंछ कमांड (दूसरे टर्मिनल में) का उपयोग कर सकते हैं; जैसे कि आप प्रगति देख सकते हैं।
tail -f output_from_sed.txt
यह वही नहीं हो सकता है जो आप खोज रहे हैं लेकिन यह किसी और की मदद कर सकता है। FWIW:
gawk -W dump-variables=/tmp/awk.log
स्क्रिप्ट के अंत में लॉग फ़ाइल में परिवर्तनीय मानों को डंप करेगा।
यह पॉटोंग के उत्तर पर आधारित है। निम्न कोड 'zz' के साथ 'll' को प्रतिस्थापित करता है, बैकअप फ़ाइल बनाता है, नया टेक्स्ट प्रदर्शित करता है, और फ़ाइल में परिवर्तन लिखता है।
$ echo hello > test
$ sed -e 's/ll/zz/;w /dev/stdout' -i .backup test
hezzo
$ cat test
hezzo
$ cat test.backup
hello
नए एसईडी संस्करणों में, यदि w से पहले अर्धविराम छोड़ दिया जाता है, डब्ल्यू एक तर्क "एस" एसईडी आदेश और केवल उन परिवर्तनों को/dev/stdout, जो मेरे लिए पूरी फ़ाइल लिखने की तुलना में अधिक उपयोगी है लिखा जाता है करने के लिए हो जाता है – Jack
"सही" यहाँ का जवाब है
pv myfile.txt | sed ...
एडुआर्डो Ivanec के जवाब करीब था, लेकिन पाइप दर्शक (PV) का उपयोग करते हुए वास्तविक पाइपिंग करने के लिए है, तो आप को पता है कि आपकी प्रगति है मिल फ़ाइल में (प्रतिशत के रूप में, एम/सेकंड, कुल डेटा इत्यादि जैसे महान आंकड़े सहित)।
cat
तरह
pv
काम करता है (फ़ाइल को पढ़ने और stdout
पर सीधे निर्यात करते हैं, या में पाइप के मामले में, यह stdin
और stdout
के बीच एक पुल है)।
महत्वपूर्ण बात, pv
के बाद से एक "पारदर्शी पाइप प्रक्रिया" है, stdout डेटा के प्रसारण के साथ व्यस्त है। तो stderr
के माध्यम से प्रगति रिपोर्ट की सूचना दी गई है।
ध्यान दें कि यह जगह-जगह प्रतिस्थापन के साथ काम नहीं करता है ... (AFAIK) – starryknight64
- 1. बैश/awk/sed/perl
- 2. sed या awk multiline
- 3. sed/awk capitalize स्ट्रिंग्स
- 4. sed/awk: टेक्स्ट स्ट्रीम से पैटर्न निकालें
- 5. sed और awk के बीच क्या अंतर है?
- 6. मतभेद और sed
- 7. मैं, यहाँ awk, SED के बारे में हैरान हूँ आदि
- 8. sed
- 9. awk
- 10. awk
- 11. awk
- 12. awk
- 13. awk
- 14. awk
- 15. Awk रिक्त लाइनों
- 16. sed/regex
- 17. डोजो/डिजीट और प्रिंटिंग
- 18. कूडा कर्नेल से प्रिंटिंग
- 19. कैसे बचें और sed
- 20. sed
- 21. अजगर बराबर sed को
- 22. sed/
- 23. awk कमांड
- 24. रेल लॉग भी वर्बोज़
- 25. sed
- 26. sed
- 27. sed
- 28. sed -
- 29. sed
- 30. sed
मेरे लिए मूल आदेश में -i ओएस एक्स पर काम नहीं करता है। क्या यह गायब है? पॉल द्वारा – Paul
टिप्पणी: काम किया उदाहरण ओएस एक्स के लिए एसईडी का उपयोग कर: '$ गूंज हैलो> परीक्षण $ एसईडी -e के/डालूँगा/जेडजेड /; w/देव/stdout 'मैं .backup परीक्षण hezzo $ बिल्ली परीक्षण हेज़ो $ cat test.backup हैलो – StuartLC
पॉल: मैक ओएस एक्स sed के बीएसडी संस्करण का उपयोग करता है, जो सामान्य रूप से लिनक्स सिस्टम पर मिले जीएनयू संस्करण के कुछ तरीकों से अलग-अलग काम करता है। बीएसडी sed के साथ आपको हमेशा * कुछ * एक्सटेंशन के लिए निर्दिष्ट करना होगा, जबकि जीएनयू sed कुछ भी खाली स्ट्रिंग के रूप में व्याख्या नहीं करता है। तो जीएनयू sed के 'sed -i' के बराबर बीएसडी sed बस 'sed -i' 'है। StuartLC के उदाहरण भी वर्शन पर एक ही काम करते हैं, क्योंकि वह जगह में फ़ाइलों का संपादन नहीं कर रहा है (यानी। वह गैर-शून्य-लंबाई एक्सटेंशन का उपयोग कर रहा है, तो यह छोटा सा फर्क में चलाने नहीं है)। – robo