2014-07-22 4 views
22

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

पैटर्न के लिए खोज:

grep -HR "pattern" . | cut -d: -f1 

यह मैं सभी फ़ाइल नाम है कि "पैटर्न" शामिल प्रिंट करता है।

अगर मैं कोशिश:

targets=$(grep -HR "pattern" . | cut -d: -f1) 
length=${#targets[@]} 
for ((i = 0; i != length; i++)); do 
    echo "target $i: '${targets[i]}'" 
done 

यह प्रिंट केवल एक ही तत्व है कि सभी filnames के साथ एक स्ट्रिंग है।

output: target 0: 'file0 file1 .. fileN' 

लेकिन मैं की जरूरत है:

output: target 0: 'file0' 
output: target 1: 'file1' 
..... 
output: target N: 'fileN' 

मैं कैसे ठिकानों पर एक उबाऊ विभाजन कार्रवाई करते समय बिना परिणाम प्राप्त कर सकते हैं?

उत्तर

33

आप उपयोग कर सकते हैं:

targets=($(grep -HRl "pattern" .)) 

नोट मार में सरणी निर्माण के लिए (...) का उपयोग।

इसके अलावा आप grep -l का उपयोग grep के आउटपुट में केवल फ़ाइल नाम प्राप्त करने के लिए कर सकते हैं (जैसा कि मेरे आदेश में दिखाया गया है)।

+0

शानदार! मैं पहले से ही "-l" विकल्प देख रहा था, बीटीडब्ल्यू महान हिट। क्या आप समझा सकते हैं कि क्यों दो ब्रैकेट जोड़ना काम करता है? –

+2

यह बाश में सरणी निर्माण का वाक्यविन्यास है। यदि आप बाहरी '(..)' को हटाते हैं तो आप केवल एक सरल शैल चर के लिए 'grep' आउटआउट असाइन कर रहे हैं जिसे सरणी के रूप में नहीं माना जाएगा। – anubhava

+2

काम नहीं कर रहा है अगर फ़ाइल नाम में व्हाइटस्पेस या वाइल्डकार्ड – lihao