Pergunta

Saudações,

Preciso armazenar o nome do arquivo de um log em uma variável para que meu script possa executar algumas verificações nos arquivos diários de log. Esses logs sempre têm um nome diferente porque têm um registro de data e hora no nome. Atualmente, estou usando um método Hodge Podged que coloca um comando LS para sed, classificar, cortar e caudar para divulgar o nome.

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 )

ATUALIZAR:

$ Cron_date é fornecido como um argumento ao script. É a data (para o dia) em que o log foi criado. Às vezes, vários logs existem para o mesmo dia, então eu quero que isso obtenha o mais recente.

Alguns nomes de arquivos típicos:
fetch_cron_false_031810090452.log
fetch_cron_true_031310090001.log
etc ...

Lembre -se de que isso funciona como está. Eu apenas acho que é feio e estou tentando encontrar uma maneira melhor de fazê -lo.

Tenho certeza de que usei isso de algumas coisas que encontrei no Google há alguns meses. Funciona agora, mas não estou muito feliz com a técnica. Tenho algumas idéias sobre como fazer isso melhor, mas tive grande sucesso neste site antes e pensei que seria melhor se referir primeiro aos deuses do Stackoverflow. Todas as respostas são muito apreciadas.

Obrigado, Ryan

Foi útil?

Solução

Que tal

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

EDITAR: Você está certo BTA, eu deveria ter pego isso. Fixo.

Outras dicas

Depois de analisar um arquivo de log, faça algo para marcar que ele foi processado, renomeando -o ou movendo -o para uma pasta diferente. Dessa forma, não importa quando o arquivo foi criado, apenas que ainda não foi analisado.

Eu também sugeriria o uso de uma linguagem de script de alto nível.

#!/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 iniciantes, tente:

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 livra de cut e negocia o sed expressão regular para uma chamada mais legível (IMO) para tr. Dividi -lo em duas linhas também ajuda com a clareza.

Se você não tem outros arquivos em $LOGS_DIR Com nomes de arquivos extremamente semelhantes (o que geralmente acontece se você mantiver os logs em questão em sua própria pasta), você pode substituir o parâmetro para ls com algo mais simples como $LOGS_DIR/fetch_*_$CRON_DATE*.log. Por uma questão de simplicidade, não torne essa linha mais complicada do que o necessário para garantir que você obtenha apenas os arquivos necessários.

Você pode mudar sua data para classificar prefixando o ano na frente e depois fazer

CRON_LOG=$(ls ${LOGS_DIR}/fetch_cron_{false,true}_${CRON_DATE}*.log| tail -1)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top