Wenn Ihre Dateinamen keine Zeilenumbrüche enthalten, können Sie mehrere Aufrufe von vermeiden, grepindem Sie die Namen der übereinstimmenden Dateien von grep drucken lassen und die Ergebnisse zählen.
local IFS=$'\n' # inside a function. Otherwise use some other way to save/restore IFS
matches=( $(grep -lw "$users" "$file1" "$file2") )
Die Anzahl der Übereinstimmungen beträgt "${#matches[@]}".
Möglicherweise gibt es hier eine Möglichkeit grep --null -lw, aber ich bin mir nicht sicher, wie ich die Ausgabe analysieren soll . Bash var=( array elements )hat keine Möglichkeit, \0stattdessen ein Trennzeichen zu verwenden \n. Vielleicht kann Bash's mapfileBuiltin das? Aber wahrscheinlich nicht, weil Sie das Trennzeichen mit angeben -d string.
Sie könnten count=$(grep -l | wc -l), aber dann haben Sie zwei externe Prozesse, so dass Sie grepdie beiden Dateien genauso gut getrennt ausführen können. (Der Unterschied zwischen Startaufwand grepund wcStartaufwand ist im Vergleich zu Fork + Exec + Dynamic Linker gering, um überhaupt einen separaten Prozess zu starten.)
Außerdem finden wc -lSie mit nicht heraus, welche Datei übereinstimmt.
Wenn die Ergebnisse in einem Array erfasst wurden, ist dies möglicherweise bereits das, was Sie möchten, oder wenn genau 1 Übereinstimmung vorliegt, können Sie überprüfen, ob es sich um die erste Eingabe handelt oder nicht.
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
$matchesist eine Abkürzung für ${matches[0]}das erste Array-Element.