如何对某个日期范围内的所有日志文件进行分类

如何对某个日期范围内的所有日志文件进行分类

我有按以下方式命名的日志文件:

localhost_log_file.2017-09-01.txt
localhost_log_file.2017-09-02.txt
....

localhost_log_file.2017-10-30.txt

换句话说,每个日志文件都具有以下形式:

localhost_log_file.YYYY-MM-DD.txt

我想收集 2017-09-03 和 2017-10-08 之间的所有日志文件,即从localhost_log_file.2017-09-03.txtlocalhost_log_file.2017-10-08.txt.

目前我所做的是通过分别执行以下每个命令来生成三个中间文件:

for((i=3;i<=9;i++)) do cat localhost_log_file.2017-09-0$i.txt >> log1.csv ; done;

for((i=10;i<=30;i++)) do cat localhost_log_file.2017-09-$i.txt >> log2.csv ; done;

for((i=1;i<=8;i++)) do cat localhost_log_file.2017-10-0$i.txt >> log3.csv ; done;

然后我将中间文件组合如下:

cat log1.csv log2.csv log3.csv> totallog.csv

有一个更好的方法吗?

答案1

您可以嵌套大括号扩展。

简短而甜蜜:

cat localhost_log_file.2017-{09-{03..30},10-{01..08}}.txt > totallog.csv

请注意,某些系统(例如 macOS)使用旧版本的 Bash,这不起作用,因为前导零已从大括号扩展整数序列中删除。对于 Linux,这工作得很好。

答案2

date使用该实用程序来迭代您感兴趣的日期范围怎么样?您的示例可能如下所示:

# Set the date counter to the start date
d=2017-09-03

# Iterate until we reach the end date (i.e. the date after the last date we want)
while [ "$d" != 2017-10-09 ]; do

    # cat each file
    cat "localhost_log_file.${d}.txt";

    # Increment the date counter
    d="$(date -I -d "$d + 1 day")";

done

请参阅此了解更多信息:

或者,您可以将循环结果传递给cat命令,而不是cat在循环体中调用。

使用命令替换可能会如下所示:

d=2017-09-03
cat $(while [ "$d" != 2017-10-09 ]; do
    echo "localhost_log_file.${d}.txt";
    d="$(date -I -d "$d + 1 day")";
done)

这是使用管道 和 的相同效果xargs

d=2017-09-03
while [ "$d" != 2017-10-09 ]; do
    echo "localhost_log_file.${d}.txt";
    d="$(date -I -d "$d + 1 day")";
done | xargs cat

答案3

使用日期:

for i in {0..35}; do
     cat localhost_log_file.$(date +%F -d "2017-09-03 + $i day").txt
done > totallog.csv

答案4

使用这个命令:

ls | sort | while read i; do  if ([ "$i" \> "localhost_log_file.2017-09-03.txt" ] || [ "$i" == "localhost_log_file.2017-09-03.txt" ]) && ([ "$i" \< "localhost_log_file.2017-10-08.txt" ] || [ "$i" == "localhost_log_file.2017-10-08.txt" ]); then cat $i >> totallog.csv ; fi ; done

你必须像这样运行它

ls | sort | while read i 按回车键
do 按回车键
if ([ "$i" \> "localhost_log_file.2017-09-03.txt" ] || [ "$i" == "localhost_log_file.2017-09-03.txt" ]) && ([ "$i" \< "localhost_log_file.2017-10-08.txt" ] || [ "$i" == "localhost_log_file.2017-10-08.txt" ]) 按回车键 then 按回车键
cat $i >> totallog.csv 按回车键
fi 按回车键
done 按回车键

相关内容