Frage

Grüße,

Ich brauche den Dateinamen eines Protokolls in eine Variable zu speichern, so dass mein Skript einige Prüfungen auf die täglichen Log-Dateien ausführen können. Diese Protokolle haben immer einen anderen Namen, weil sie einen Zeitstempel im Namen haben. Derzeit verwende ich eine hodge podged Methode, dass Rohre ein Befehl ls zu sed, sortiert, geschnitten und Schwanz aus, um den Namen zu erhalten.

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 )

UPDATE:

$ CRON_DATE wird als Argument an das Skript geliefert. Es ist der Zeitpunkt (dem Tag), dass das Protokoll wurde am erstellt. Manchmal mehrere Protokolle für den gleichen Tag gibt es so möchte ich die jüngste zu bekommen.

Einige typische Dateinamen:
fetch_cron_false_031810090452.log
fetch_cron_true_031310090001.log
etc ...

Beachten Sie bitte, dass das funktioniert, wie es ist. Ich denke nur, es ist hässlich und ich versuche, einen besseren Weg zu finden, um es auszuziehen.

Ich bin ziemlich sicher, dass ich dieses kluged zusammen aus einigen Sachen, die ich vor ein paar Monaten google gefunden. es funktioniert jetzt, aber ich bin nicht wirklich mit der Technik zufrieden. Ich habe einige Ideen, wie dies besser zu tun, aber ich habe auf dieser Seite hatte großen Erfolg vor und dachte, es am besten sein könnte zunächst auf die Götter Stackoverflow zu verweisen. Alle Antworten werden sehr geschätzt.

Danke, Ryan

War es hilfreich?

Lösung

Wie wäre es

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

EDIT: Du hast Recht BTA, sollte ich das gefangen haben. Festgelegt.

Andere Tipps

Wenn Sie eine Protokolldatei analysieren, etwas tun, um Marke, dass es verarbeitet wurde, eine solche Umbenennung oder es in einen anderen Ordner verschieben. Auf diese Weise wird es keine Rolle, wenn die Datei erstellt wurde, nur dass es noch analysiert worden ist.

Ich würde auch vorschlagen, eine hohe Skriptsprache.

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

Für den Anfang versuchen:

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

Das Beseitigt cut und handelt den sed regulären Ausdruck für einen lesbaren (IMO) Aufruf tr. Splitting in zwei Linien hilft bei der Klarheit als auch.

Wenn Sie keine andere Dateien in $LOGS_DIR mit extrem ähnlichen Dateinamen (die in der Regel passieren, wenn Sie die Protokolle in Frage in einem eigenen Ordner halten), können Sie die Parameter auf ls mit etwas einfacher wie $LOGS_DIR/fetch_*_$CRON_DATE*.log ersetzen. Aus Gründen der Einfachheit nicht, dass die Linie macht komplizierter als erforderlich Sie nur die Dateien, um sicherzustellen, erhalten Sie benötigen.

Sie Ihr Datum zu sortierbar ändern können, indem das Jahr vor prefixing, dann tun

CRON_LOG=$(ls ${LOGS_DIR}/fetch_cron_{false,true}_${CRON_DATE}*.log| tail -1)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top