जवाबों:
आसान तरीकों में से एक आउटपुट को एक चर में संग्रहीत नहीं करना है, लेकिन थोड़ी देर / रीड लूप के साथ सीधे उस पर पुनरावृति करना है।
कुछ इस तरह:
grep xyz abc.txt | while read -r line ; do
echo "Processing $line"
# your code goes here
done
इस योजना में भिन्नताएँ हैं, यह इस बात पर निर्भर करता है कि आप क्या कर रहे हैं।
यदि आपको लूप के अंदर चरों को बदलने की आवश्यकता है (और उस परिवर्तन को इसके बाहर दिखाई दे रहा है), तो आप प्रक्रिया प्रतिस्थापन का उपयोग कर सकते हैं जैसा कि फेडोरक्वी के उत्तर में कहा गया है :
while read -r line ; do
echo "Processing $line"
# your code goes here
done < <(grep xyz abc.txt)
while read p || [[ -n $p ]]; do ...
( stackoverflow.com/questions/1521462/… ) से उधार लिया गया
आप निम्न while read
लूप कर सकते हैं , grep
जिसे तथाकथित प्रक्रिया प्रतिस्थापन के उपयोग से कमांड के परिणाम द्वारा खिलाया जाएगा :
while IFS= read -r result
do
#whatever with value $result
done < <(grep "xyz" abc.txt)
इस तरह, आपको परिणाम को एक चर में संग्रहीत नहीं करना है, लेकिन लूप के आउटपुट को सीधे "इंजेक्ट" करना है।
BashFAQ / 001 में सिफारिशों के अनुसार IFS=
और उपयोग पर ध्यान दें read -r
: मैं एक फ़ाइल (डेटा स्ट्रीम, चर) लाइन-बाय-लाइन (और / या फ़ील्ड-बाय-फ़ील्ड) कैसे पढ़ सकता हूं? :
पढ़ने के लिए -r विकल्प बैकस्लैश व्याख्या को रोकता है (आमतौर पर बैकस्लैश न्यूलाइन जोड़ी के रूप में उपयोग किया जाता है, कई लाइनों पर जारी रखने के लिए या सीमांकक से बचने के लिए)। इस विकल्प के बिना, इनपुट में किसी भी तरह के बैकस्लैश को छोड़ दिया जाएगा। आपको रीड के साथ लगभग हमेशा -r विकल्प का उपयोग करना चाहिए।
IFS के ऊपर के परिदृश्य में = व्हाट्सएप को अग्रणी और अनुगामी बनाने से रोकता है। यदि आप यह प्रभाव चाहते हैं तो इसे हटा दें।
प्रक्रिया प्रतिस्थापन के संबंध में, इसे हैश पेज में समझाया गया है :
प्रक्रिया प्रतिस्थापन एक पुनर्निर्देशन का एक रूप है जहां एक प्रक्रिया का इनपुट या आउटपुट (कुछ अनुक्रम के आदेश) एक अस्थायी फ़ाइल के रूप में दिखाई देते हैं।
for
संस्करण निकाला । पर एक पाश करने की कोशिश की "${$(grep xyz abc.txt)[@]}"
के रूप में stackoverflow.com/a/14588210/1983854 लेकिन नहीं कर सके। इसलिए मैं सिर्फ पहला संस्करण छोड़ता हूं।
zsh
, जहां उस तरह का घोंसला शायद काम करता है)।
while IFS= read -r result <&3
औरdone 3< <(grep ...
मैं यहाँ grep + कुछ और के बजाय awk का उपयोग करने का सुझाव दूंगा।
awk '$0~/xyz/{ //your code goes here}' abc.txt
//your code goes here
?
बिना किसी लाइन के - बिना बफर वाले grep विकल्प के साथ:
your_command | grep --line-buffered "your search"
वास्तविक जीवन में एक सिम्फनी PHP फ्रेमवर्क राउटर डिबग कमांड के साथ छूट, सभी "एपीआई" संबंधित मार्गों को प्राप्त करने के लिए:
php bin/console d:r | grep --line-buffered "api"
tail -f some.log
, मेरे मामले में) ...
अक्सर प्रसंस्करण का क्रम मायने नहीं रखता है। इस स्थिति के लिए GNU समानांतर बनाया गया है:
grep xyz abc.txt | parallel echo do stuff to {}
यदि आप प्रसंस्करण अधिक पसंद कर रहे हैं:
grep xyz abc.txt | myprogram_reading_from_stdin
और myprogram
धीमा है तो आप चला सकते हैं:
grep xyz abc.txt | parallel --pipe myprogram_reading_from_stdin
grep -o
इस प्रकार की चीज़ की शक्ति का उल्लेख नहीं करता है।-o
झंडा वापस दे देंगे केवल उत्पादन की प्रति पंक्ति एक मैच के साथ, उस पाठ को मैचों। (यह संपूर्ण नहीं है, इसलिएecho aaa |grep 'a*'
केवल आपको "आआ" देता है और तीन आंशिक मैचों "", "ए", और "आ" को छोड़ देता है)