Dosya adlarınız satırsonu içermiyorsa, grep'in grepeşleşen dosyaların adlarını yazdırmasını ve sonuçları saymasını sağlayarak birden fazla çağrıyı önleyebilirsiniz .
local IFS=$'\n' # inside a function. Otherwise use some other way to save/restore IFS
matches=( $(grep -lw "$users" "$file1" "$file2") )
Eşleşme sayısı "${#matches[@]}".
Burada kullanmanın bir yolu olabilir grep --null -lw, ancak çıktıyı nasıl ayrıştırılacağından emin değilim . Bash yerine var=( array elements )bir \0sınırlayıcı kullanmanın bir yolu yoktur \n. Belki de bashın mapfileyerleşimi bunu yapabilir mi? Ama muhtemelen hayır, çünkü ayırıcıyı ile belirtirsiniz -d string.
Yapabilirsiniz count=$(grep -l | wc -l), ancak sonra iki harici işleminiz vardır, böylece grepiki dosyayı ayrı ayrı da çalıştırabilirsiniz . (Arasındaki fark grepgenel wcbaşlangıç yükü her ayrı bir işlem başlatmak için çatal + exec + Dinamik bağlayıcı malzeme ile karşılaştırıldığında küçüktür).
Ayrıca, hangi dosyanın eşleştiğini wc -lde bulamazsınız .
Bir dizide yakalanan sonuçlar ile, zaten istediğiniz gibi olabilir veya tam olarak 1 eşleşme varsa, bunun ilk giriş olup olmadığını kontrol edebilirsiniz.
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
$matcheskısayol ${matches[0]}, ilk dizi elemanıdır.