Question

Bonjour,

Je dois stocker le nom d'un journal dans une variable donc mon script peut effectuer des contrôles sur les fichiers journaux quotidiens. Ces journaux ont toujours un nom différent parce qu'ils ont un horodatage dans le nom. Actuellement, je suis en utilisant une méthode podged de Hodge que les tuyaux d'une commande ls à sed, trier, couper, et la queue afin d'obtenir le nom sur.

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 )

Mise à jour:

CRON_DATE $ est fourni comme argument au script. Il est la date (le jour) que le journal a été créé. Parfois, plusieurs journaux existeront pour le même jour, donc je veux que ce pour obtenir le plus récent.

Quelques noms typiques:
fetch_cron_false_031810090452.log
fetch_cron_true_031310090001.log
etc ...

S'il vous plaît garder à l'esprit que cela fonctionne comme cela est. Je pense juste qu'il est laid et essaie de trouver une meilleure façon de le retirer.

Je suis sûr que je kluged cela ensemble de quelques trucs que j'ai trouvé Google il y a quelques mois. il fonctionne maintenant, mais je ne suis pas vraiment satisfait de la technique. J'ai quelques idées sur la façon de faire mieux, mais je l'ai eu beaucoup de succès sur ce site avant et pensé qu'il pourrait être préférable de se référer aux dieux stackoverflow premier. Toutes les réponses sont très appréciés.

Merci, Ryan

Était-ce utile?

La solution

Qu'en est-

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

EDIT: Vous avez raison BTA, j'aurais pris ça. Fixe.

Autres conseils

Une fois que vous analysez un fichier journal, faire quelque chose pour marquer qu'il a été traité, un tel changement de nom ou le déplacer vers un autre dossier. De cette façon, il ne sera pas question lorsque le fichier a été créé, mais seulement qu'il n'a pas encore été analysé.

Je suggère également d'utiliser un plus haut langage de script de niveau.

#!/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

Pour commencer, essayez:

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

qui se débarrasse de cut et métiers l'expression régulière de sed pour un appel à tr plus lisible (OMI). Scindant en deux lignes contribue à la clarté ainsi.

Si vous n'avez pas d'autres fichiers $LOGS_DIR avec des noms très similaires (ce qui se produit généralement si vous conservez les journaux en question dans leur propre dossier), vous pouvez remplacer le paramètre à ls avec quelque chose de plus simple comme $LOGS_DIR/fetch_*_$CRON_DATE*.log. Par souci de simplicité, ne font pas cette ligne plus compliquée que nécessaire pour vous assurer d'obtenir uniquement les fichiers dont vous avez besoin.

vous pouvez changer votre date triables par préfixer l'année avant, puis faire

CRON_LOG=$(ls ${LOGS_DIR}/fetch_cron_{false,true}_${CRON_DATE}*.log| tail -1)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top