问候,

我需要将日志的文件名存储到变量中,以便我的脚本可以对每日日志文件执行一些检查。这些日志始终具有不同的名称,因为它们的名称中包含时间戳。目前,我正在使用一种 Hodge podged 方法,该方法将 ls 命令通过管道传输到 sed、sort、cut 和 tail,以便获取名称。

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
ETC...

请记住,这是按原样工作的。我只是觉得这很丑陋,正在努力寻找更好的方法来实现它。

我很确定我是从几个月前在谷歌上找到的一些东西中拼凑出来的。它现在可以工作了,但我对这项技术不太满意。我对如何做得更好有一些想法,但我之前在这个网站上取得了巨大的成功,并且认为最好先参考 stackoverflow 的大神。非常感谢所有答案。

谢谢,瑞安

有帮助吗?

解决方案

怎么样

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

编辑: 你是对的,我应该明白这一点。固定的。

其他提示

您解析一个日志文件后,做一些标记,它已被处理,这样的重命名,或将其移动到不同的文件夹。通过这种方式创建的文件时,都不会有问题,只是它尚未被解析。

我也建议使用更高级脚本语言。

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