Если ваши имена файлов не содержат символов новой строки, вы можете избежать нескольких вызовов grep
, если 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
встроенный Bash может сделать это? Но, вероятно, нет, потому что вы указываете разделитель с -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]}
первого элемента массива.