Si vos noms de fichiers ne contiennent pas de sauts de ligne, vous pouvez éviter plusieurs invocations grep
en 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 -lw
ici, mais je ne sais pas comment analyser la sortie . Bash var=( array elements )
n'a aucun moyen d'utiliser un \0
délimiteur à la place de \n
. Peut-être que la fonction mapfile
inté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 grep
les deux fichiers séparément. (La différence entre les frais généraux grep
et le wc
démarrage est faible par rapport à fork + exec + truc de l'éditeur de liens dynamique pour démarrer un processus distinct).
De plus, wc -l
vous 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
$matches
est un raccourci pour ${matches[0]}
, le premier élément du tableau.