Jika nama file Anda tidak mengandung baris baru, Anda dapat menghindari beberapa pemanggilan grep
dengan meminta cetak nama file yang cocok, dan hitung hasilnya.
local IFS=$'\n' # inside a function. Otherwise use some other way to save/restore IFS
matches=( $(grep -lw "$users" "$file1" "$file2") )
Jumlah kecocokan adalah "${#matches[@]}"
.
Mungkin ada cara untuk digunakan di grep --null -lw
sini, tapi saya tidak yakin bagaimana mem-parsing output . Bash var=( array elements )
tidak memiliki cara untuk menggunakan \0
pembatas alih-alih \n
. Mungkin mapfile
built bash bisa melakukannya? Tapi mungkin tidak, karena Anda menentukan pembatas dengan -d string
.
Anda bisa count=$(grep -l | wc -l)
, tetapi kemudian Anda memiliki dua proses eksternal sehingga Anda mungkin juga menjalankan grep
dua file secara terpisah. (Perbedaan antara overhead startup grep
vs wc
kecil dibandingkan dengan fork + exec + hal-hal linker dinamis untuk memulai proses yang terpisah sama sekali).
Juga, dengan wc -l
Anda tidak menemukan file mana yang cocok.
Dengan hasil yang ditangkap dalam sebuah array, itu mungkin sudah seperti yang Anda inginkan, atau jika ada 1 yang cocok, Anda dapat memeriksa apakah itu input pertama atau tidak.
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
adalah singkatan untuk ${matches[0]}
, elemen array pertama.