如何获取同一日期的所有日志文件并写入新日志?

如何获取同一日期的所有日志文件并写入新日志?
TMW_yyyymm=`date +%Y%m --date='tomorrow'`
YDY_yyyymmdd=`date +%Y%m%d --date='yesterday'`
YDY_yyyymm=`date +%Y%m --date='yesterday'`
TODAY=`date +'%Y%m%d'`

SRC_LOG="/home/user/bin/abc.log.${YDY_yyyymmdd}"
HOMEDIR="/home/user/bin"
DEST="/log/user/abc"

上面是我从前同事那里得到的旧脚本的一部分,我必须对其进行修改以执行以下操作:

在SRC_LOG中,将有多个格式为abc.log.[yyyymmdd].[0-n]的日志文件

例如

 abc.log.20230221.0
 abc.log.20230221.1
 abc.log.20230221.2

等等,但我不知道每天会生成多少个日志文件。

我想修改脚本以循环遍历目录“SRC_LOG”并获取同一天的所有日志文件,然后将当天的所有日志文件合并到一个新的日志文件中。

问题是我不熟悉 bash 脚本,也不知道如何提取每天所需的文件,即如何循环后缀 .0 .1 .2 ...等。

任何帮助表示赞赏,谢谢!

答案1

我会做什么:

今天:

 d=$(date +%Y%m%d)
 find ./dir -name "abc.log.${d}.[0-9]*" -exec cat {} + > "${d}.log'
 #rm ./dir/abc.log.${d}.*

适应其他日期

答案2

如果有以下日志文​​件一个特定日期$SRC_LOG目录中:

printf '%s\n' "$SRC_LOG"/abc.log.* | sort -V | xargs cat > "/path/to/${SRC_LOG##*/}"
  • sort -V确保后缀.0之前已排序.10
  • ${SRC_LOG##*/}从路径中删除目录组件作为组合日志的新文件名

根据需要更改目标目录。


如果有以下日志文​​件各种日期$SRC_LOG目录中:

cd "$SRC_LOG"
printf '%s\n' abc.log.* | cut -d. -f-3 | sort -u |
    xargs -I{} sh -c 'printf "%s\n" "$1".* | sort -V |
        xargs cat > "/path/to/$1"' sh '{}'

打印所有日志文件的文件名,删除后缀部分,然后进行唯一排序以获取所有不带后缀的日志文件名。

然后将结果传递给xargs,为每个参数启动一个脚本以打印带有后缀的日志文件名称,将结果和cat这些文件排序到输出文件中。


使用 GNU 工具的带有制表符或换行符的文件名的更安全的空终止版本是

printf '%s\0' "$SRC_LOG"/*.log.* | sort -zV | xargs -0 cat > "/path/to/${SRC_LOG##*/}"

printf '%s\0' *.log.* | cut -zd. -f-3 | sort -zu |
    xargs -0I{} sh -c 'printf "%s\0" "$1".* | sort -zV |
        xargs -0 cat > "/path/to/$1"' sh '{}'

相关内容