Formatos de fecha, su endianness, ISO 8601 y otras reflexiones

Introducción

El propósito de esta publicación es reflexionar en los diferentes formatos de fecha, sus conceptualizaciones, sus ambigüedades, su endianness y finalmente el formato internacional de fecha ISO 8601.

El endianness se refiere al extremo por el que comienza la representación de un número. Por ejemplo, para el número 547 —y considerando que en español escribimos de izquierda a derecha— primero escribimos el 500, después el 40 y después el 7. El 5 tiene más valor relativo que el 7. Puesto que se comienza por el dígito de mayor valor, a esto se le llama big-endian y es común en protocolos de red. El contrario se denomina little-endian y es común en algunos procesadores de Intel. Cuando no se sigue un orden progresivo se le dice middle-endian.

Sigue leyendo

Esperar hasta terminar la entrada estándar

Si uno teclea líneas a la entrada estándar desde el teclado, ésta se va procesando línea por línea:

$ cat -n
hola
     1	hola
mundo
     2	mundo
maravilloso
     3	maravilloso
^D
$

Así, resulta impráctico marcar la salida usando el ratón para copiarlo al portapapeles o simplemente para ver la salida junta. Como alternativas tenemos:

  • Marcar y copiar línea por línea, acumulando el resultado en un editor antes de copiar todo el texto. Muy impráctico.
  • Redirigir la salida a un archivo, pero aún queda pendiente tener que procesar y borrar el archivo después.
  • Usar tac | tac:
    $ tac | tac | cat -n
    hola
    mundo
    maravilloso
    ^D
         1	hola
         2	mundo
         3	maravilloso
    $
    

tac es una instrucción que concatena archivos y los despliega en reversa (LIFO en lugar de FIFO por línea). Por naturaleza, tac se ve en la obligación de leer la entrada estándar completa antes de poder mandar la primera línea de su salida. Si invertimos la entrada dos veces se obtiene el efecto deseado.

No sé hasta cuántas líneas soporte antes de volverse lento. Aquí con 10,000 líneas funciona aún bastante bien.

¿Alguien conoce alguna mejor manera?

Actualización: Dualbus me recomienda sponge de moreutils. Ejemplo:

$ sponge | cat -n
hola
mundo
maravilloso
^D
     1	hola
     2	mundo
     3	maravilloso
$

Según el manual, sponge «absorbe la entrada estándar y la escribe a un archivo».

postfix_delivery_search.bash

Este script sirve para buscar en los logs de Postfix 2.9.6 la historia de entrega de los correos que cumplan con el from= y el to= que se indiquen en el primer y segundo argumento del script, respectivamente.

#!/bin/bash

# Configuration variables
REQUIREMENTS="gawk grep"
LOGSOURCES="/var/log/mail.info.1 /var/log/mail.info"

# Check requirements
which $REQUIREMENTS > /dev/null 2>&1 || {
    echo The following required programs were not found:
    for R in $REQUIREMENTS; do
        which "$R" > /dev/null 2>&1 || echo "$R"
    done
    exit 63
}

# Check arguments
[ $# -eq 2 ] || {
    echo Usage: "$0" source_address destination_address
    exit 1
}

# These work for Postfix 2.9.6
function get_filter_from() {
    echo 'BEGIN { FS="[ :]+"} /from=<'$1'>/ && !/NOQUEUE/ { print $8 }'
}

function get_filter_to() {
    echo 'BEGIN { FS="[ :]+"} /to=<'$1'>/ && !/NOQUEUE/ { print $8 }'
}

function awniq() {
    gawk '!a[$0]++'
}

FILTER_FROM=$(get_filter_from "$1")
FILTER_TO=$(get_filter_to "$2")

# For each mail ID found in both from= and to= lines...
for ID in $(grep -f <(gawk "$FILTER_FROM" $LOGSOURCES | awniq) \
  <(gawk "$FILTER_TO" $LOGSOURCES | awniq))
do
    echo ====== $ID ======
    grep -- "$ID" /var/log/{mail.info.1,mail.info}
done