Buscar aquí

26 marzo 2015

Obtener la fecha en distintos formatos

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





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

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í:

  • 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
Este es un uso muy simple para la inmensa potencialidad de awk, pues en sí mismo es un pseudo lenguaje de programación.