Wenn Ihre Dateinamen keine Zeilenumbrüche enthalten, können Sie mehrere Aufrufe von vermeiden, grep
indem 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, \0
stattdessen ein Trennzeichen zu verwenden \n
. Vielleicht kann Bash's mapfile
Builtin 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 grep
die beiden Dateien genauso gut getrennt ausführen können. (Der Unterschied zwischen Startaufwand grep
und wc
Startaufwand ist im Vergleich zu Fork + Exec + Dynamic Linker gering, um überhaupt einen separaten Prozess zu starten.)
Außerdem finden wc -l
Sie 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
$matches
ist eine Abkürzung für ${matches[0]}
das erste Array-Element.