Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Una consulta sobre grep

6 views
Skip to first unread message

Carlos Iriondo

unread,
Jul 28, 2004, 6:50:08 PM7/28/04
to

Hola a todos.

Hace tiempo que busco la manera de solucionar esto y no lo puedo hacer.

Tengo un archivo de datos en modo txt sacado del archivo passwd, al que le he suprimido todo menos los siguientes datos:

usuario:nombre:grupo:home

Por ejemplo:

gSanabria:Gustavo Sanabria:Estadistica:/home/estadistica/gSanabria

 

Con un script que encontre en Internet para agregar usuarios desde un archivo me funciona pero siempre y cuando no use el “nombre” ya que ahí falla el script, es decir, no me trae correctamente el nombre completo del usuario. El script en cuestion es:

 

#script to add many users .

#here you will have to create a file called users.dat in /root dir.

#the format of the file should be as below

#USER:GROUPNAME:HOMEDIRECTORY:SHELL

#the script will take the parameters as input and configure the user.

#the passwd of the user will also be configured thru the script.

 

#you can add as many users as you want via this script by editing the /tmp/users.dat file.

#

#script by Suhas Oka...........

for i in `cat /root/users.dat`

do

USER=`echo $i | awk -F":" '{print $1}'`

GROUP=`echo $i | awk -F":" '{print $2}'`

DIR=`echo $i | awk -F":" '{print $3}'`

SHELL=`echo $i | awk -F":" '{print $4}'`

/usr/sbin/useradd -g $GROUP -d $DIR -m -s $SHELL $USER

done

#script to add single user.....

 

Yo lo modifique para incluir el nombre de esta forma:

USER=`echo $i | awk -F":" '{print $1}'`

NAMEUSU=`echo $i | awk -F":" '{print $2}'`

GROUP=`echo $i | awk -F":" '{print $3}'`

DIR=`echo $i | awk -F":" '{print $4}'`

SHELL=`echo $i | awk -F":" '{print $5}'`

/usr/sbin/useradd -g $GROUP -d $DIR –c $NAMEUSU -m -s $SHELL $USER

done

 

Pero no funciona porque no reconoce el espacio en blanco del nombre completo del usuario y me trunca y desacomoda el resto de los datos.

Alguien tiene alguna sugerencia de cómo lo puedo hacer?

Saludos cordiales,

Eduardo Gargiulo

unread,
Jul 28, 2004, 7:40:10 PM7/28/04
to
Carlos Iriondo <ciri...@pol.una.py> wrote:
[...]

/usr/sbin/useradd -g $GROUP -d $DIR -c "$NAMEUSU" -m -s $SHELL $USER
^^^^^^^^^^

Notar la variable entre comillas.

apt-salutti

--ejg


--
To UNSUBSCRIBE, email to debian-user-s...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listm...@lists.debian.org

César Rincón

unread,
Jul 28, 2004, 8:20:07 PM7/28/04
to
On Wed, 2004-07-28 at 17:42, Carlos Iriondo wrote:
> Pero no funciona porque no reconoce el espacio en blanco del nombre
> completo del usuario y me trunca y desacomoda el resto de los datos.

El script que estás usando como base para tus modificaciones deja
bastante qué desear. Procura no aprender mucho de ese código.

> Alguien tiene alguna sugerencia de cómo lo puedo hacer?

------------------------------------------------------------------------
#! /bin/bash

while IFS=: read -r -a datos
do
# Estas asignaciones son innecesarias. Se hacen por legibilidad.
usuario="${datos[0]}"
nombre="${datos[1]}"
grupo="${datos[2]}"
home="${datos[3]}"

# Hacer algo con los datos aquí.
# En tu caso, probablemente será algo como
#
# useradd -g "$grupo" -d "$home" -m -c "$nombre" -s /bin/false\
# "$usuario"
#
# Ojo, cuida las comillas, y verifica el error al retorno de
# useradd!
#
# Unos echos, por mientras.
echo "Usuario: [$usuario]"
echo "Nombre: [$nombre]"
echo "Grupo: [$grupo]"
echo "Home: [$home]"
done
------------------------------------------------------------------------

Este script muy probablemente requiere bash(1), no cualquier sh. Pero
estamos en debian-user-spanish, asi que eso no debería ser un
problema...

Úsalo redirigiendo la entrada desde tu archivo, e.g.

script.sh < /tmp/usuarios.dat

Tomar el nombre del archivo como parámetro es trivial, claro, pero así
es un poco más simple, y quizá hasta más flexible (puedes teclear los
datos de entrada, o pipearlos desde un sed(1), por ejemplo).

> Saludos cordiales,

Iguanas.

-CR

Carlos Iriondo

unread,
Jul 29, 2004, 1:00:12 PM7/29/04
to
Hola a todos.
Voy a probar las sugerencias, aunque no entiendo muy bien el
funcionamiento (soy medio novato en esto de los script).
Saludos cordiales,

-----Mensaje original-----
De: César Rincón [mailto:cri...@et.com.mx]
Enviado el: miércoles, 28 de julio de 2004 20:14
Para: debian-us...@lists.debian.org
Asunto: Re: Una consulta sobre grep

César Rincón

unread,
Jul 29, 2004, 4:10:13 PM7/29/04
to
On Thu, 2004-07-29 at 12:47, Carlos Iriondo wrote:
> Hola Cesar.

Carlos.

Estoy copiando de vuelta a la lista, para el archivo.

> No he conseguido hacer funcionar el script que me diste, porque no
> entiendo bien su funcionamiento.

Lee el manual builtins(7), especialmente el comando "read". Creo que
todo lo que hay que saber acerca de este script está documentado en esa
sección.

Si no estás a gusto con los manuales en inglés, instala
manpages-es-extra. Ahí vienen bash(1) y builtins(7) en español.

Otras referencias:

http://es.tldp.org/COMO-INSFLUG/COMOs/Bash-Prog-Intro-COMO/
http://www.demiurgo.org/doc/shell/shell.html

> Lo copie a un archivo que se llama prueba.sh tal como te muestro a
> continuacion.
[...]
> Pero no funciona me dice: ./prueba.sh: datos[0]: command not found

Curioso. Acabo de usar tu mensaje para recrear el script y el archivo
de datos, y funciona perfectamente en mi máquina. Parece que tu bash no
soportara arreglos, o algo así. ¿Qué versión estás usando?

Como sea, me hiciste leer el manual de nuevo, y darme cuenta de lo sucio
que es usar un arreglo para esto. Prueba mejor así:

------------------------------------------------------------------------
#! /bin/sh

while IFS=: read -r usuario nombre grupo home
do


echo "Usuario: [$usuario]"
echo "Nombre: [$nombre]"
echo "Grupo: [$grupo]"
echo "Home: [$home]"
done
------------------------------------------------------------------------

Hasta donde sé esto no contiene "bashismos", debería correr en cualquier
shell POSIX. Yo lo probé en bash, pdksh, ash y dash. Me sorprendería
mucho que tuvieras problemas con esto.

> Debe ser realmente trivial, pero no sé como se hace esto, como dije no
> conozco practicamente nada de scritp y menos aun bash, sed, etc. Aparte
> mi ingles no es muy bueno para entender la documentacion

------------------------------------------------------------------------
#! /bin/sh

if [ $# -ne 1 ] ; then
echo "Uso: $0 archivo" >&2
exit 1
fi

(while IFS=: read -r usuario nombre grupo home
do


echo "Usuario: [$usuario]"
echo "Nombre: [$nombre]"
echo "Grupo: [$grupo]"
echo "Home: [$home]"

done) < "$1"
------------------------------------------------------------------------

Tú dirás si es trivial o no. Alternativamente, puedes definir el while
dentro de una función, y llamar a la función redirigiendo su entrada.
Yo haría eso si hubiera mucho código dentro de ese while.

Carlos Iriondo

unread,
Jul 29, 2004, 6:00:16 PM7/29/04
to
Hola Cesar.
Este si funciona, por fin hace lo que quiero.
Te estoy profundamente agradecido, cada día aprendo algo nuevo
Lo probe en rh9 y perfecto, pero en debian 3.0r1 recompilado para smp no
muestra nada en la salida pero tampoco muestra mensajes de error. El
shell en ambos es bash. Rarito no!!, pero creo que algo anda mal con la
PC que tiene debian, porque cuando quiero actualizar, ya sea desde el
cdrom o desde internet, me resetea la pc, es como que no soporta la
carga de trabajo. De hecho es un servidor cuya fuente original se quemó
y como no tenemos rubro para comprar otra (doble fuente reduntante)
ahora está trabajando con una fuente atx normalita de 300w, la original
era de 500w

Saludos cordiales,

0 new messages