Formato fecha, script bash

Shalauras

Buenas,

No sabia muy bien llamar al tema, asi que intentaré explicarme con la suficiente claridad.
Os cuento, debo de realizar diariamente informes de máquinas de mi empresa, dicho infrome, lo realizo con un script que elaboré en bash, dicho script en su principio tiene un formato donde saco la fecha actual y finalmente es ese el archivo que se vuelca.
Me explico:

hoy=date +%d%m%Y

d=date +%d

m=date +%m

a=date +%Y

mes=date|awk '{print $2}'
dia=date|awk '{print $3}'

echo "----Mensajes-----" >> ${hoy}.txt
cat /var/log/messages|grep -i "${mes} ${dia}" >> ${hoy}.txt
echo " " >> ${hoy}.txt

Con eso lo que realmente hago es sacar la fecha por pantalla y tras ejecutar un comando lo vuelco en el fichero que tiene el nombre de la fecha.
Mi problema viene con lo siguiente. Cuando el mes es dias 1-9 el /log/messages tiene un formato así: Dic 1, cuando es día 10-30, es así: Dic 20 . La diferencia es un solo espacio entre los numeros o dos en caso de ser un solo número.

Ahora mi duda, en dias 1-9 no me muestra nada por que yo tengo escrito que el comando sea con 1 espacio y no con 2, ¿como podría hacer que me añadiese al fichero el texto aunque fuera un dia comprendido ntre 1-9?
He pensado en hacer esto:

cat /var/log/messages|grep -i "${mes} ${dia}" >> ${hoy}.txt || cat /var/log/messages|grep -i "${mes} ${dia}" >> ${hoy}.txt

Es decir, tendría un ó, y si no encuentra nada, busca la otra opción, pero ese metodo no esta del todo depurado, así que pense hacerlo con if, algo asi:
if [$dia <= 0]
then
COMANDO
else
COMANDo
fi

Pero no me funciona, me muestra errores.
¿Alguien tiene idea de como podría hacerlo? entiendo que me he podido explicar algo mal, asi que si alguien puede echarme una manilla que prgunte y lo comentamos.

Aprovecho para comentar un segundo error en mi script. (este mas breve)

Yo hago una busqueda de los usuarios que tienen crontab activos(algo asi)

cat /etc/passwd|egrep -v "nologin|false|...." | awk '{print $1}' && crontab -l $a >> {hoy}.txt

El problema es que al hacer eso, por pantalla al ejecutar el script sale por pantalla "no crontab" cada vez que no encuentra un crontab para los usuarios.
¿hay forma de que no muestre NADA por pantalla?

Gracias a los que se presten a leerlo y encima rsponder jeje

Un saludo!

Get

mm me pierdo en tu explicacion del primer error.

en el segundo deberias mirar en en el directorio de los jobs de usuarios.
/var/spool/cron/crontabs/
este directorio contiene los crontabs de cada usuario. si no hay fichero con el nombre de usuario, esque ese usuario no tiene crontab definido.

[get@tsys0101 (/var/spool/cron)]$ sudo ls crontabs
cron.update  root

lo de enmarcar como codigo es: "[ code ] [ / code ]" quita los espacios.

MaKi

En lo del if ... then ... else ... fi tienes que poner ; despues del test. Es decir:

if [$dia <= 0];
then
COMANDO
else
COMANDo
fi
Shalauras

#3 probé también con ; pero nada. Escribo lo siguiente:

echo "----Mensajes-----" >> ${hoy}.txt
if [$dia <= "9"];
then
cat /var/log/messages|grep -i "${mes} ${dia}" >> ${hoy}.txt
else
cat /var/log/messages|grep -i "${mes} ${dia}" >> ${hoy}.txt
fi
echo " " >> ${hoy}.txt

Y me devuelve: "no eixste el fichero o directorio, en line 87" que es la linea del [$dia <= "9"

#2, lo que pretendo es sacar por pantalla los logs del /var/log/messages del dia actual, para ello saco la fecha con DATE, corto por el dia y el mes , y luego busco en el archivo con esos patrones.
Lo que ocurre es que el /var/log/messages cuando el día es 1,2,3,4,5,6,7,8,9 tiene dos separacione entre MES y DIA, ej: Dic 1 y yo en mi script tengo puesto que sea 1 solo espacio, ya que cuando es 10-31 solo deja un espacio entre MES y DIA, por esa razon, intento buscar alguna sentencia O, IF, o derivados para que compruebe ambas opciones.
Espero haberme explicado con la sufiiente claridad.

Un saludo y gracias.

Get

SED: tu solucion
Stream EDitor Manual
para quitar un espacio:

cat textoquecontieneespacios |sed "s/ //g" > ficherosinespacios

espero q esto te sirva

antes: hola que tal.
Despues: holaquetal.

Shalauras

#5 pero eso modificaria todo el fichero var/log/messages, yo quiero que mi script interprete tanto el espacio unico como el espacio doble o bien cn alguna sentencia o que se yo. Si uso SED sobre el log me juntará todo lo que haya, y bueno, el log tiene bastantes cosas y m resultaria algo lioso.

Respecto lo del crontab, me sigue saliendo por pantalla los usuarios que tienen algun crontab al ejecutar mi script, yo quiero q solo lo vuelce por pantalla, ya que de la otra manera, ejecuto el script y m salen cosas asi:
no crontab for aleysaplaya
no crontab for hercules-seguridad
no crontab for asesoriageconte
no crontab for ga-asesores
no crontab for we-equip
no crontab for musicadeandalucia
no crontab for gbresidencias
no crontab for acoixta
no crontab for fabricius-development
no crontab for wigep
no crontab for darterapia
no crontab for hotelguadalupe
no crontab for munsuri

Y eso no quiero q m salga ahi ya que despues en mi fichero de texto lo miraré. Con tu propuesto alivio un poco el asunto ya que me salen menos lineas, ya que hay menos usuarios con crontab que sin crontab, pero no obstante, ¿se podria depurar aun mas para que no salga por pantalla y lo vuelce directamente al fichero? .. yo tengo fé y se que debe haber algun parametro de linux que no te muestre por pantalla nada, a modo de un "anti verbose :P"

Gracias de nuevo.

Get

claro, redireciona el stdin y stdout al fichero. y lo q sobra a la basura

ejemplo:
comando1 2>&1 >fichero
o ala basura:
comando1 2>&1 >/dev/null

ah, para debugar o depurar tus scripts añade set -x al principio, y donde quieras hacer una pausa escribe bash cuando llegues a esa linea ejecutando un exit, el programa continuara.

MaKi

prueba en lugar del "<=" pon "-le" que es el formato del test

man test

Usuarios habituales

  • MaKi
  • Get
  • Shalauras