Pregunta

Saludos,

necesito para almacenar el nombre de archivo de un registro en una variable por lo que mi escritura se puede realizar algunas comprobaciones en los archivos de registro diario. Estos registros siempre tienen un nombre diferente porque tienen una marca de tiempo en el nombre. Actualmente estoy usando un método Hodge podged que las tuberías de un comando ls para sed, clasificar, cortar, y la cola con el fin de obtener el nombre de cabo.

CRON_LOG=$(ls -1 $LOGS_DIR/fetch_cron_{true,false}_$CRON_DATE*.log 2> /dev/null | sed 's/^[^0-9][^0-9]*\([0-9][0-9]*\).*/\1 &/' | sort -n | cut -d ' ' -f2- | tail -1 )

ACTUALIZACIÓN:

$ CRON_DATE se suministra como un argumento para el guión. Es la fecha (al día) que el registro se creó el. A veces existirán varios registros para el mismo día, así que quiero esto para conseguir el más reciente.

Algunos nombres de archivo TIPICA fetch_cron_false_031810090452.log
fetch_cron_true_031310090001.log
etc ...

Por favor, tenga en cuenta que esto funciona como es. Sólo creo que es feo y estoy tratando de encontrar una mejor manera de llevarlo a cabo.

Estoy bastante seguro de que esto juntos kluged de algunas cosas que encontré Google hace unos meses. funciona ahora, pero no estoy muy contento con la técnica. Tengo algunas ideas sobre cómo hacerlo mejor, pero he tenido un gran éxito en este sitio antes y pensé que podría ser mejor para referirse a los dioses stackoverflow primero. Todas las respuestas son muy apreciados.

Gracias, Ryan

¿Fue útil?

Solución

¿Qué tal

CRON_LOG=$(ls -c $LOGS_DIR/fetch_cron_*$CRON_DATE* | head -1)

editar Tiene razón BTA, debería haber cogido eso. Fijo.

Otros consejos

Después de analizar un archivo de registro, hacer algo para marcar que ha sido procesado, por ejemplo un cambio de nombre o moverlo a una carpeta diferente. De esta manera no importa cuando se creó el archivo, sólo que no se ha analizado todavía.

También se recomienda usar un lenguaje más alto nivel de secuencias de comandos.

#!/bin/bash
shopt -s nullglob

last=
for file in "$LOGS_DIR"/fetch_cron_{false,true}_"$CRON_DATE"*.log
do
  last="$file"
done

if [ -n "$last" ]
then
  echo "$last"
else
  echo "No match found" >&2
  exit 1
fi

Para empezar, trate de:

FILELIST=`ls -1 $LOGS_DIR/fetch_cron_{true,false}_$CRON_DATE*.log`
CRON_LOG=`echo $FILELIST | tr -d [:alpha:][:punct:] | sort -n | tail -1`

que se deshace de cut y ejerce sus actividades con la expresión regular sed para una más legible (OMI) llamar a tr. Dividiéndolo en dos líneas de ayuda con la claridad también.

Si usted no tiene ningún otro archivo en $LOGS_DIR con nombres muy similares (que por lo general ocurre si mantiene los registros en cuestión en su propia carpeta), puede reemplazar el parámetro a ls con algo más simple como $LOGS_DIR/fetch_*_$CRON_DATE*.log. En aras de la simplicidad, no hacen que la línea más complicado de lo necesario para asegurarse de que obtiene sólo los archivos que necesita.

Puede cambiar la fecha a que se pueden ordenar anteponiendo el año delante, y luego hacer

CRON_LOG=$(ls ${LOGS_DIR}/fetch_cron_{false,true}_${CRON_DATE}*.log| tail -1)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top