Dosya adlarınız satırsonu içermiyorsa, grep'in grep
eş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 \0
sınırlayıcı kullanmanın bir yolu yoktur \n
. Belki de bashın mapfile
yerleş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 grep
iki dosyayı ayrı ayrı da çalıştırabilirsiniz . (Arasındaki fark grep
genel wc
baş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 -l
de 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
$matches
kısayol ${matches[0]}
, ilk dizi elemanıdır.