2012-03-23 12 views

उत्तर

4

आप एक फाइल करने के लिए sed या awk के उत्पादन रीडायरेक्ट कर रहे (के बजाय यथा-स्थान फ़ाइलों को संशोधित) आप pv ("पाइप दर्शक") एक शॉट देने के कर सकते हैं:

sed -e '...' input.txt | pv > output.txt 

आप उपयोग कर सकते हैं pv -l इसे लिखित लाइनों में प्रगति की रिपोर्ट करने के लिए। प्रगति की स्थिति stderr पर मुद्रित हो जाती है जबकि वास्तविक डेटा क्रूज stdin से stdout तक होता है।

4

तुम हमेशा 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 

मुझे उम्मीद है कि इससे मदद मिलती है।

5

यह आपको (एसईडी के लिए) के लिए काम कर सकते हैं:

sed -i 's/foo/bar/;w /dev/stdout' files* 
+0

मेरे लिए मूल आदेश में -i ओएस एक्स पर काम नहीं करता है। क्या यह गायब है? पॉल द्वारा – Paul

+0

टिप्पणी: काम किया उदाहरण ओएस एक्स के लिए एसईडी का उपयोग कर: '$ गूंज हैलो> परीक्षण $ एसईडी -e के/डालूँगा/जेडजेड /; w/देव/stdout 'मैं .backup परीक्षण hezzo $ बिल्ली परीक्षण हेज़ो $ cat test.backup हैलो – StuartLC

+1

पॉल: मैक ओएस एक्स sed के बीएसडी संस्करण का उपयोग करता है, जो सामान्य रूप से लिनक्स सिस्टम पर मिले जीएनयू संस्करण के कुछ तरीकों से अलग-अलग काम करता है। बीएसडी sed के साथ आपको हमेशा * कुछ * एक्सटेंशन के लिए निर्दिष्ट करना होगा, जबकि जीएनयू sed कुछ भी खाली स्ट्रिंग के रूप में व्याख्या नहीं करता है। तो जीएनयू sed के 'sed -i' के बराबर बीएसडी sed बस 'sed -i' 'है। StuartLC के उदाहरण भी वर्शन पर एक ही काम करते हैं, क्योंकि वह जगह में फ़ाइलों का संपादन नहीं कर रहा है (यानी। वह गैर-शून्य-लंबाई एक्सटेंशन का उपयोग कर रहा है, तो यह छोटा सा फर्क में चलाने नहीं है)। – robo

3

आप लिनक्स पर हैं, तो आप /proc/<pid>/fdinfo में देख द्वारा प्रक्रिया है कि एक बड़ी फ़ाइलों को संसाधित कर रहा है की प्रगति देख सकते हैं। प्रत्येक खुली फ़ाइल डिस्क्रिप्टर के लिए वहां एक प्रविष्टि है, और यदि आप प्रविष्टियों को बिल्ली देते हैं, तो वे आपको फ़ाइल डिस्क्रिप्टर की पढ़ने/लिखने की स्थिति दिखाते हैं। तो आप देख सकते हैं कि आप फ़ाइल में 1123456 बाइट्स हैं। खुली फाइलों के पथ नाम किसी अन्य क्षेत्र में हैं: /proc/<pid>/fd, सिम्लिंक के रूप में प्रतिनिधित्व किया जाता है।

इससे पहले कि मैं इसे देखूं, मैं आमतौर पर प्रक्रिया में strace संलग्न करता हूं: strace -p <pid>। आप यह देखने के लिए उपयोग कर सकते हैं कि कौन सी प्रणाली प्रक्रिया को कॉल कर रही है: फ़ाइल पढ़ती है और लिखती है, और brk या mmap के साथ मेमोरी आवंटन।

+0

सुविधा के लिए: 'पीएस कुल्हाड़ी | grep foo' जहां 'foo' प्रश्न में प्रोग्राम का नाम उपरोक्त उपयोग के लिए प्रक्रिया आईडी खोजने के लिए उपयोग किया जा सकता है। –

5

इस धारणा पर कि आप फ़ाइल में अपने sed आउटपुट को पाइप कर रहे हैं, तो आप फाइल के अंत को लगातार देखने के लिए पूंछ कमांड (दूसरे टर्मिनल में) का उपयोग कर सकते हैं; जैसे कि आप प्रगति देख सकते हैं।

tail -f output_from_sed.txt 
2

यह वही नहीं हो सकता है जो आप खोज रहे हैं लेकिन यह किसी और की मदद कर सकता है। FWIW:
gawk -W dump-variables=/tmp/awk.log
स्क्रिप्ट के अंत में लॉग फ़ाइल में परिवर्तनीय मानों को डंप करेगा।

7

यह पॉटोंग के उत्तर पर आधारित है। निम्न कोड 'zz' के साथ 'll' को प्रतिस्थापित करता है, बैकअप फ़ाइल बनाता है, नया टेक्स्ट प्रदर्शित करता है, और फ़ाइल में परिवर्तन लिखता है।

$ echo hello > test 
$ sed -e 's/ll/zz/;w /dev/stdout' -i .backup test 
hezzo 
$ cat test 
hezzo 
$ cat test.backup 
hello 
+2

नए एसईडी संस्करणों में, यदि w से पहले अर्धविराम छोड़ दिया जाता है, डब्ल्यू एक तर्क "एस" एसईडी आदेश और केवल उन परिवर्तनों को/dev/stdout, जो मेरे लिए पूरी फ़ाइल लिखने की तुलना में अधिक उपयोगी है लिखा जाता है करने के लिए हो जाता है – Jack

0

"सही" यहाँ का जवाब है

pv myfile.txt | sed ... 

एडुआर्डो Ivanec के जवाब करीब था, लेकिन पाइप दर्शक (PV) का उपयोग करते हुए वास्तविक पाइपिंग करने के लिए है, तो आप को पता है कि आपकी प्रगति है मिल फ़ाइल में (प्रतिशत के रूप में, एम/सेकंड, कुल डेटा इत्यादि जैसे महान आंकड़े सहित)।

cat तरह

pv काम करता है (फ़ाइल को पढ़ने और stdout पर सीधे निर्यात करते हैं, या में पाइप के मामले में, यह stdin और stdout के बीच एक पुल है)।

महत्वपूर्ण बात, pv के बाद से एक "पारदर्शी पाइप प्रक्रिया" है, stdout डेटा के प्रसारण के साथ व्यस्त है। तो stderr के माध्यम से प्रगति रिपोर्ट की सूचना दी गई है।

+0

ध्यान दें कि यह जगह-जगह प्रतिस्थापन के साथ काम नहीं करता है ... (AFAIK) – starryknight64