Si sus nombres de archivo no contienen nuevas líneas, puede evitar múltiples invocaciones grep
haciendo que grep imprima los nombres de los archivos coincidentes y cuente los resultados.
local IFS=$'\n' # inside a function. Otherwise use some other way to save/restore IFS
matches=( $(grep -lw "$users" "$file1" "$file2") )
El número de partidos es "${#matches[@]}"
.
Puede haber una forma de usar grep --null -lw
aquí, pero no estoy seguro de cómo analizar la salida . Bash var=( array elements )
no tiene una forma de usar un \0
delimitador en lugar de \n
. Tal vez bashtin mapfile
incorporado puede hacerlo? Pero probablemente no, porque especificas el delimitador con -d string
.
Podría count=$(grep -l | wc -l)
, pero luego tiene dos procesos externos, por lo que podría ejecutar grep
los dos archivos por separado. (La diferencia entre la sobrecarga de inicio grep
y la de wc
inicio es pequeña en comparación con las cosas fork + exec + dynamic linker para iniciar un proceso por separado).
Además, con wc -l
usted no descubre qué archivo coincide.
Con los resultados capturados en una matriz, eso podría ser lo que desea, o si hay exactamente 1 coincidencia, puede verificar si fue la primera entrada o no.
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
es la abreviatura de ${matches[0]}
, el primer elemento de matriz.