Siempre la manipulación de la fecha es un lío, una manera fácil de hacer, es utilizando el mismo comando date -funciona en linux y HPUX- por ejemplo:
[arturo@Linux ~]$ date -u +%Y-%m-%d
2015-03-26
el -u indica que queremos la salida de la fecha y con + entregamos el formato que queremos, aquí un par más:
[arturo@Linux ~]$ date -u +%X
02:38:53 PM
[arturo@Linux ~]$ date -u +%F
2015-03-26
o junto:
[arturo@Linux ~]$ date -u +%F-%X
2015-03-26-02:39:42 PM
ahora si quisieramos por ejemplo un archivo con la fecha, podriamos hacer algo así:
NOMARCHIVO="archivo_del_"`date -u +%F`".txt"
touch $NOMARCHIVO
entonces:
[arturo@Linux ~]$ NOMARCHIVO="archivo_del_"`date -u +%F`".txt"
[arturo@Linux ~]$ touch $NOMARCHIVO
[arturo@Linux ~]$ ll $NOMARCHIVO
-rw-rw-r--. 1 arturo arturo 0 Mar 26 11:42 archivo_del_2015-03-26.txt
Este blog tiene la idea de acercar un poco el tema de las herramientas computacionales, usando preferencialemente Linux, y traducir a "cristiano" todos esos programas, software y otras palabras raras que usan los que saben de computación y aquellos que dicen saber también. Por eso aquí va un filtro con cosas útiles e intentado ser claro, cualquier cosa... por mail, msn, comentarios, etc como quieran, manden preguntas, felicitaciones, reclamos, inquietudes, etc. etc.
Buscar aquí
26 marzo 2015
20 marzo 2015
Leer un archivo con un script en shell
Muchas veces es necesario procesar los contenidos de un archivo desde el shell de linux para ejecutar alguna acción, por ejemplo:
#!/bin/sh
while read line
do
echo $line
done < nombre_del_archivo
Este script hace algo muy simple, lee cada linea del archivo y la escribe por pantalla. Hay una diferencia importante, es que este script considera todo el contenido de la linea, mientras que al usar una sentencia for, toma sólo la primera palaba hasta el separador, que por defecto es el espacio, por eso, es común tener algún problema al usar la sentencia for cuando se quiere leer la línea completa.
En el caso del for sería algo así:
for linea in `cat archivo`
do
echo $linea
done
#!/bin/sh
while read line
do
echo $line
done < nombre_del_archivo
Este script hace algo muy simple, lee cada linea del archivo y la escribe por pantalla. Hay una diferencia importante, es que este script considera todo el contenido de la linea, mientras que al usar una sentencia for, toma sólo la primera palaba hasta el separador, que por defecto es el espacio, por eso, es común tener algún problema al usar la sentencia for cuando se quiere leer la línea completa.
En el caso del for sería algo así:
for linea in `cat archivo`
do
echo $linea
done
04 marzo 2015
Utilizar el contenido de un archivo para generar otro, pero filtrado
Muy común es la necesidad de utilizar el contenido de un archivo para generar otro, sea este nuevo un informe, un subconjunto del utilizado como fuente, por ejemplo, tenemos un archivo con los siguientes datos
123 marcelo rut 123712
421 jorge rut 88876
8766 marcela rut 98787
766 fernando rut -
lo guardo en un archivo llamado awktest para efectos de mostrar el funcionamento.
Si se fijan, el último tiene un guión en lugar de número, entonces, en el caso que quiera obtener los registros que tengan la palabra rut y seguida de un conjunto de números, podemos utilizar el comando awk de la siguiente forma:
[test@Linux ~]# awk '/rut/&&/ +[0-9]/ { print $0 }' awktest
123 marcelo rut 123712
421 jorge rut 88876
8766 marcela rut 98787
Ahora, el efecto de utilizar algo así: awk '/ +[0-9]/ { print $0 }' awktest para este caso entrega el mismo resultado, salvo si existiera un registro con un registro como:
765 pablo RuT 6543
Este sera mostrado:
[test@Linux ~]# awk '/ +[0-9]/ { print $0 }' awktest.awk
123 marcelo rut 123712
421 jorge rut 88876
8766 marcela rut 98787
765 pablo RuT 6543
a diferencia del primer comando, donde busca la palabra rut de manera literal.
Ahora el comando se compone así:
123 marcelo rut 123712
421 jorge rut 88876
8766 marcela rut 98787
766 fernando rut -
lo guardo en un archivo llamado awktest para efectos de mostrar el funcionamento.
Si se fijan, el último tiene un guión en lugar de número, entonces, en el caso que quiera obtener los registros que tengan la palabra rut y seguida de un conjunto de números, podemos utilizar el comando awk de la siguiente forma:
[test@Linux ~]# awk '/rut/&&/ +[0-9]/ { print $0 }' awktest
123 marcelo rut 123712
421 jorge rut 88876
8766 marcela rut 98787
Ahora, el efecto de utilizar algo así: awk '/ +[0-9]/ { print $0 }' awktest para este caso entrega el mismo resultado, salvo si existiera un registro con un registro como:
765 pablo RuT 6543
Este sera mostrado:
[test@Linux ~]# awk '/ +[0-9]/ { print $0 }' awktest.awk
123 marcelo rut 123712
421 jorge rut 88876
8766 marcela rut 98787
765 pablo RuT 6543
a diferencia del primer comando, donde busca la palabra rut de manera literal.
Ahora el comando se compone así:
- awk, el comando en sí mismo.
- El símbolo ' indica el inicio los parametros para el comando distintos al archivo o entrada
- El texto existente entre los slash / son los elementos que busca de manera literal. El texto a buscar debe ir entre dos slash.
- El símbolo & repetido, indica un y lógico, un AND, entonces decimos que busque rut y el segundo elemento.
- El elemento +[0-9] quiere decir que debe ir una cadena de numeros, entre 0 y 9, con al menos un número y no importa cuantos exista.
- Entre los símbolos { } están las acciones que se aplicarán a los registros que cumplan con la condición, en este caso print $0 muestra la línea completa entrante.
- Finalmente el archivo que será utilizado como entrada
Suscribirse a:
Entradas (Atom)