Se os nomes dos seus arquivos não contiverem novas linhas, você poderá evitar várias invocações de grep
fazendo com que o 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 . Bash var=( array elements )
não tem como usar um delimitador \n
em vez de mapfile
. Talvez bash -d string
builtin pode fazer isso? Mas provavelmente não, porque você especifica o delimitador com count=$(grep -l | wc -l)
.
Você pode usar grep
, mas você tem dois processos externos, portanto, pode executar apenas grep
nos dois arquivos separadamente. (A diferença entre wc
vs. wc -l
de sobrecarga de inicialização é pequena em comparação com o fork + exec + material de vinculador dinâmico para iniciar um processo separado).
Além disso, com $matches
você não encontra o qual arquivo correspondente.
Com os resultados capturados em uma matriz, que já pode ser o que você quer, ou se houver exatamente 1 correspondência, você pode 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[0]}
é a abreviação de %code% , o primeiro elemento da matriz.