![如何获取同一日期的所有日志文件并写入新日志?](https://linux22.com/image/217206/%E5%A6%82%E4%BD%95%E8%8E%B7%E5%8F%96%E5%90%8C%E4%B8%80%E6%97%A5%E6%9C%9F%E7%9A%84%E6%89%80%E6%9C%89%E6%97%A5%E5%BF%97%E6%96%87%E4%BB%B6%E5%B9%B6%E5%86%99%E5%85%A5%E6%96%B0%E6%97%A5%E5%BF%97%EF%BC%9F.png)
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 '{}'