Pv (पाइप दर्शक) का उपयोग करते हुए ग्रेप प्रगति पट्टी


11

मुझे अपने कंप्यूटर पर एक बड़ी निर्देशिका मिली है और मुझे एक स्ट्रिंग के लिए अंदर हर रूबी फ़ाइल में खोज करने की आवश्यकता है।

मैं इसे इस तरह से कर सकता था: grep -R "string" *.rbलेकिन यह वास्तव में लंबा लगता है और मैं grepप्रगति की निगरानी करने में सक्षम होने के लिए प्रगति पट्टी दिखाने के लिए pv (पाइप दर्शक) का उपयोग करना चाहूंगा ।

लेकिन मैं वास्तव में नहीं जानता कि मैं इस कमांड को कैसे लिख सकता हूं क्योंकि अभी भी कुछ चीजें हैं जो मैं अभी इस कमांड के बारे में नहीं समझ सकता हूं।

किसी को कोई विचार है?

जवाबों:


15

pvपाइप पर काम करता है (कमांड नहीं) - यह एक वॉल्यूम गेज है जो दिखाता है कि पाइपलाइन में दिए गए बिंदु से कितना डेटा अतीत में चला गया है।
आपका grep कमांड कोई पाइपलाइन नहीं है ( |- pipe operatorयह कहीं नहीं पाया जाता है) - यह सिर्फ एक ही काम कर रहा है। pvयहां आपकी मदद नहीं कर सकता, आपको बस उस पर भरोसा करना होगा जो grepवास्तव में सभी इनपुट फाइलों पर अपनी बात कर रहा है।

आप सकता है खोजने, PV, xargs और ग्रेप (के साथ कुछ साथ बुरा काम find . -name "*.rb" | pv | xargs grep [regex]ऐसा लग रहा है का वादा किया जा सकता है, लेकिन आपको बता करने के लिए होगा pvकितना बड़ा findउत्पादन यह सार्थक परिणाम देने के लिए के लिए है।

सच कहूँ तो यह काम की तुलना में अधिक लगता है। बस अपना grep चलाएं, धैर्यपूर्वक प्रतीक्षा करें और जब यह हो जाए तब आउटपुट से निपटें।


1
यह निश्चित रूप से संभव है , यह सिर्फ जटिल है और शायद एक साथ रखने के लिए अधिक समय लगेगा और
जीआरई

1
वास्तव में अच्छा स्निपेट हो सकता है: p
Cydonia7

4

दो और तरीके:

for file in *.rb; do echo $file; grep "string" $file >> output.txt; done

या, एक अलग शेल में, जब आपका मूल कमांड चल रहा हो, grep कमांड के पीड को ढूंढें और फिर:

strace -q -s 256 -e trace=open -p [pid] 2>&1 | head

उपरोक्त दोनों आपको दिखाएंगे कि वर्तमान में किस grep कमांड पर काम चल रहा है। आप के साथ कुल फ़ाइलों की संख्या पा सकते हैं:

ls -l *.rb | wc -l

अंत में, यह पता लगाने के लिए कि सूची में वर्तमान फ़ाइल किस नंबर पर है:

ls -l *.rb | grep -n [the current filename]

PS मेरे उत्तर मान लेते हैं कि आपकी सभी फाइलें एक ही डायरेक्टरी में हैं। यदि वे नहीं हैं, तो आपको सुझाए गए और पतले होने के findबजाय उपयोग करना होगा ।ls*.rb


1
यह एक अच्छा विकल्प है
Cydonia7

1

मुझे यकीन नहीं है कि आप किस ओएस का उपयोग कर रहे हैं, लेकिन grep -R "string" *.extआपके लिए सही तरीके से काम नहीं कर रहा है।

आप findके साथ संयोजन के रूप में उपयोग किया जा सकता है grep:

find . -type f -name "*.rb" -print0 |xargs --null grep "string"


ठीक है, मैंने जो आदेश दिया है वह वास्तव में फेडोरा 16 पर काम करता है लेकिन आपका स्पष्ट है। धन्यवाद !
18-30 बजे Cydonia7

1

हाल के संस्करणों में pvएक "-d"अन्य प्रक्रिया के सभी FD देखने के लिए एक -Option है।

तो सिद्धांत pvरूप में न केवल एक पाइप के रूप में काम करेगा, बल्कि एक पूरी प्रक्रिया के लिए प्रगति-संकेतक के रूप में भी काम करेगा। (उदाहरण के लिए, इसे अपने फ़ायरफ़ॉक्स की पीआईडी ​​के साथ आज़माएं)

समस्या के लिए ऊपर एक सरल विचार निम्नलिखित है: जबकि grepचल रहा है, lsofसाथ में उपयोग करें watch

$ watch -n 1 "lsof | grep -n $PWD"

इस तरह से आप अपने grep की प्रगति की निगरानी कर सकते हैं।


0

क्या आपने पहले ही कोशिश की है

grep -R "string" *.rb | pv

मुझे नहीं पता कि क्या यह वास्तव में काम करता है क्योंकि यह नहीं जानता कि कुल डेटा के कितने बिट्स हैं क्योंकि यह पुनरावर्ती है?


4
मुझे नहीं लगता कि यह कि वह क्या चाहता है क्या करेंगे है - pvग्रेप के उत्पादन पर काम किया जाएगा (ताकि भले ही वह निर्दिष्ट पूर्ण इनपुट आकार pvकेवल देखता उत्पादन पाइप के अंत बाहर आ - यह होगा जिस तरह के तहत -बाइटिंग बाइट्स।
voretaq7

0

मैं आमतौर पर लिनक्स सिस्टम पर प्रोक-फाइलसिस्टम का उपयोग करता हूं, अर्थात

ls -al /proc/<pid of grep>/fd

यह उन सभी फ़ाइलों को सूचीबद्ध करता है जो grep-invocation वर्तमान में खुली हैं और इस प्रकार खोज में यह बताती हैं कि यह वर्तमान में कहां है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.