سؤال

تحية طيبة،

أحتاج إلى تخزين اسم ملف تسجيل الدخول إلى متغير حتى يتمكن البرنامج النصي الذي يمكنه إجراء بعض الشيكات على ملفات السجل اليومية. تحتوي هذه السجلات دائمًا على اسم مختلف لأن لديهم طابع زمني في الاسم. حاليًا ، أستخدم طريقة Hodge Podged التي تقوم بتوصيل أمر LS إلى SED وفرز وقطع وذيل من أجل إخراج الاسم.

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 )

تحديث:

يتم توفير $ cron_date كوسيطة للنص. إنه التاريخ (إلى اليوم) الذي تم إنشاء السجل عليه. في بعض الأحيان ، ستكون هناك سجلات متعددة في نفس اليوم ، لذلك أريد أن تحصل على أحدث.

بعض أسماء الملفات النموذجية:
fetch_cron_false_031810090452.log
fetch_cron_true_031310090001.log
إلخ...

يرجى أن تضع في اعتبارك أن هذا يعمل كما هو. أعتقد أنه قبيح وأحاول إيجاد طريقة أفضل لسحبها.

أنا متأكد من أنني قمت بتجميع هذا معًا من بعض الأشياء التي وجدتها Google قبل بضعة أشهر. إنه يعمل الآن لكنني لست سعيدًا حقًا بهذه التقنية. لدي بعض الأفكار حول كيفية القيام بذلك بشكل أفضل ، لكنني حققت نجاحًا كبيرًا على هذا الموقع من قبل واعتقدت أنه قد يكون من الأفضل الإشارة إلى آلهة Stackoverflow أولاً. جميع الإجابات موضع تقدير كبير.

شكرا يا ريان

هل كانت مفيدة؟

المحلول

ماذا عن

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

تعديل: أنت على حق BTA ، كان ينبغي عليّ أن أقبض على ذلك. مُثَبَّت.

نصائح أخرى

بعد تحليل ملف السجل ، قم بشيء لتمييزه أنه تمت معالجته ، مثل إعادة تسميته أو نقله إلى مجلد مختلف. وبهذه الطريقة لن يكون الأمر مهمًا عند إنشاء الملف ، فقط لم يتم تحليله بعد.

أود أن أقترح أيضًا استخدام لغة برمجة أكثر ارتفاعًا.

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

للمبتدئين ، جرب:

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

يتخلص من cut وتداول sed تعبير منتظم لدعوة (IMO) أكثر قابلية للقراءة tr. تقسيمه إلى سطرين يساعد في الوضوح أيضًا.

إذا لم يكن لديك أي ملفات أخرى في $LOGS_DIR مع أسماء ملفات متشابهة للغاية (والتي تحدث عادةً إذا احتفظت بالسجلات في السؤال في مجلدها الخاص) ، يمكنك استبدال المعلمة بـ ls مع شيء أبسط مثل $LOGS_DIR/fetch_*_$CRON_DATE*.log. من أجل البساطة ، لا تجعل هذا الخط أكثر تعقيدًا من المطلوب لضمان حصولك على الملفات التي تحتاجها فقط.

يمكنك تغيير تاريخك إلى الفرز عن طريق البادئة في المقدمة ، ثم القيام به

CRON_LOG=$(ls ${LOGS_DIR}/fetch_cron_{false,true}_${CRON_DATE}*.log| tail -1)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top