Якщо ваші імена файлів не містять нових рядків, ви можете уникнути декількох викликів 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]}
першого елемента масиву.