Estoy intentando crear un script donde un usuario puede ingresar 3 argumentos diferentes (nombres de usuario) para ver si está en línea.
Actualmente tengo who | grep "^$1"
lo que mostrará a quién se busca, pero cuando intento agregar $2 y $3 como
who | grep "^$1" "^$2" "^$3"
da un error que dice que no existe tal archivo o directorio, pero funciona bien cuando solo tengo un argumento único. ¿Alguna sugerencia?
Respuesta1
who | grep -e "^$1" -e "^$2" -e "^$3"
debería hacer
Respuesta2
Grep se comporta de manera diferente según el tipo de motor de expresión regular que esté utilizando. Por defecto utilizaExpresiones regulares básicaspero también puede usarExpresiones regulares extendidascon -E
y, en grep
versiones que admiten esta función, Expresiones regulares compatibles con Perlcon -P
.
BRE sólo puede buscar dos patrones, no más. La sintaxis es:
grep 'pattern1\|pattern2'
ERE y PCRE pueden buscar un número arbitrario, su sintaxis es la misma a este respecto, solo cambia el indicador de opción:
grep -E 'pattern1|pattern2|pattern3|patternN'
grep -P 'pattern1|pattern2|pattern3|patternN'
Entonces, para tu caso, podrías hacer algo como:
who | grep -E "^$1|^$2|^$3"
Respuesta3
Recomiendo hacer algo como esto:
who | awk '{print $1}'
awk imprimirá la primera columna o los nombres de los usuarios actualmente conectados.
Como señaló terdon, para reducirlo aún más a tres argumentos:
who | awk -v one=$1 -v two=$2 -v three=$3 '$1==one||$1==two||$1==three'