Se i nomi dei file non contengono nuove righe, è possibile evitare più invocazioni grep
facendo stampare a grep i nomi dei file corrispondenti e contare i risultati.
local IFS=$'\n' # inside a function. Otherwise use some other way to save/restore IFS
matches=( $(grep -lw "$users" "$file1" "$file2") )
Il numero di partite è "${#matches[@]}"
.
Potrebbe esserci un modo per utilizzare grep --null -lw
qui, ma non sono sicuro di come analizzare l'output . Bash var=( array elements )
non ha un modo di usare un \0
delimitatore invece di \n
. Forse l'integrato di Bash mapfile
può farlo? Ma probabilmente no, perché si specifica il delimitatore con -d string
.
Potresti count=$(grep -l | wc -l)
, ma poi hai due processi esterni, quindi potresti anche solo eseguire grep
i due file separatamente. (La differenza tra grep
vs. wc
overhead di avvio è piccola rispetto a roba fork + exec + Dynamic Linker per avviare un processo separato).
Inoltre, con wc -l
te non scopri quale file corrisponde.
Con i risultati acquisiti in un array, potrebbe essere già quello che vuoi o se esiste esattamente 1 corrispondenza, puoi verificare se è stato il primo input o meno.
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
è una scorciatoia per ${matches[0]}
, il primo elemento dell'array.