Se os seus nomes de arquivos não contiverem novas linhas, você poderá evitar várias chamadas grep
fazendo com que grep imprima os nomes dos arquivos correspondentes e conte os resultados.
local IFS=$'\n' # inside a function. Otherwise use some other way to save/restore IFS
matches=( $(grep -lw "$users" "$file1" "$file2") )
O número de correspondências é "${#matches[@]}"
.
Pode haver uma maneira de usar grep --null -lw
aqui, mas não sei como analisar a saída . O Bash var=( array elements )
não tem como usar um \0
delimitador em vez de \n
. Talvez o mapfile
builtin do bash possa fazer isso? Mas provavelmente não, porque você especifica o delimitador com -d string
.
Você poderia count=$(grep -l | wc -l)
, mas então você tem dois processos externos, para que você possa executar apenas grep
nos dois arquivos separadamente. (A diferença entre a sobrecarga grep
versus a wc
inicialização é pequena em comparação com o material fork + exec + linker dinâmico para iniciar um processo separado).
Além disso, wc -l
você não descobre qual arquivo corresponde.
Com os resultados capturados em uma matriz, isso já pode ser o que você deseja ou, se houver exatamente 1 correspondência, é possível verificar se foi a primeira entrada ou não.
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
é uma abreviação de ${matches[0]}
, o primeiro elemento da matriz.