Si vos noms de fichiers ne contiennent pas de sauts de ligne, vous pouvez éviter plusieurs invocations grepen demandant à grep d'imprimer les noms des fichiers correspondants et de compter les résultats.
local IFS=$'\n' # inside a function. Otherwise use some other way to save/restore IFS
matches=( $(grep -lw "$users" "$file1" "$file2") )
Le nombre de correspondances est "${#matches[@]}".
Il pourrait y avoir un moyen d'utiliser grep --null -lwici, mais je ne sais pas comment analyser la sortie . Bash var=( array elements )n'a aucun moyen d'utiliser un \0délimiteur à la place de \n. Peut-être que la fonction mapfileintégrée de bash peut le faire? Mais probablement pas, car vous spécifiez le délimiteur avec -d string.
Vous pouvez le faire count=$(grep -l | wc -l), mais vous disposez de deux processus externes, vous pouvez donc tout aussi bien exécuter greples deux fichiers séparément. (La différence entre les frais généraux grepet le wcdémarrage est faible par rapport à fork + exec + truc de l'éditeur de liens dynamique pour démarrer un processus distinct).
De plus, wc -lvous ne savez pas quel fichier correspond.
Avec les résultats capturés dans un tableau, cela pourrait déjà être ce que vous voulez, ou s'il y a exactement 1 correspondance, vous pouvez vérifier s'il s'agissait de la première entrée ou non.
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
$matchesest un raccourci pour ${matches[0]}, le premier élément du tableau.