Якщо ваші імена файлів не містять нових рядків, ви можете уникнути декількох викликів 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, але я не впевнений, як аналізувати вихід . Bash var=( array elements )не має способу використовувати \0роздільник, а не \n. Може, mapfileвбудований Баш може це зробити? Але, мабуть, ні, тому що ви вказали роздільник з -d string.
Можна count=$(grep -l | wc -l), але тоді у вас є два зовнішні процеси, тож ви можете просто запустити grepдва файли окремо. (Різниця між grepпроти wcнакладних витрат запуску мала по порівнянні з вилковим + + Exec динамічний компонувальник матеріал , щоб запустити окремий процес взагалі).
Крім того, 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]}першого елемента масиву.