यदि आपके फ़ाइल नाम में नई लाइनें नहीं हैं, तो आप grep
grep से मेल खाने वाली फ़ाइलों के नाम प्रिंट करके, और परिणामों को गिनकर कई इनवॉइस से बच सकते हैं ।
local IFS=$'\n' # inside a function. Otherwise use some other way to save/restore IFS
matches=( $(grep -lw "$users" "$file1" "$file2") )
मैचों की संख्या है "${#matches[@]}"
।
यहां उपयोग करने का एक तरीका हो सकता grep --null -lw
है, लेकिन मुझे यकीन नहीं है कि आउटपुट को पार्स कैसे किया जाए । बैश के बजाय var=( array elements )
एक \0
सीमांकक का उपयोग करने का एक तरीका नहीं है \n
। हो सकता है कि बैश का mapfile
बेसिन ऐसा कर सकता है? लेकिन शायद नहीं, क्योंकि आप परिसीमन को निर्दिष्ट करते हैं -d string
।
आप कर सकते हैं count=$(grep -l | wc -l)
, लेकिन फिर आपके पास दो बाहरी प्रक्रियाएं हैं, इसलिए आप grep
अलग-अलग दो फाइलों पर बस चला सकते हैं। (के बीच अंतर grep
बनाम wc
स्टार्टअप भूमि के ऊपर कांटा + कार्यकारी + डायनामिक लिंकर सामान की तुलना में बिल्कुल एक अलग प्रक्रिया शुरू करने छोटा है)।
इसके अलावा, wc -l
आपको यह पता नहीं चलता है कि कौन सी फाइल मेल खाती है।
किसी सरणी में कैप्चर किए गए परिणामों के साथ, जो पहले से ही आप चाहते हैं, या यदि वास्तव में 1 मैच है, तो आप देख सकते हैं कि यह पहला इनपुट था या नहीं।
local IFS=$'\n' # inside a function. Otherwise use some other way to save/restore IFS
matches=( $(grep -lw "$users" "$file1" "$file2") )
# print the matching filenames
[[ -n $matches ]] && printf 'match in %s\n' "${matches[@]}"
# figure out which input position the name came from, if there's exactly 1.
if [[ "${#matches[@]" -eq 1 ]]; then
if [[ $matches == "$file1" ]];then
echo "match in file1"
else
echo "match in file2"
fi
fi
$matches
${matches[0]}
पहले सरणी तत्व के लिए आशुलिपि है ।