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

Ric*_*cky 5 linux csv cat

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

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

localhost_log_file.2017-10-30.txt
Run Code Online (Sandbox Code Playgroud)

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

localhost_log_file.YYYY-MM-DD.txt
Run Code Online (Sandbox Code Playgroud)

我想猫的所有的2017年9月3日和2017年10月8日的日期之间所采取的日志文件,即从开始的每个日志文件localhost_log_file.2017-09-03.txt通过localhost_log_file.2017-10-08.txt

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

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

localhost_log_file.2017-10-30.txt
Run Code Online (Sandbox Code Playgroud)

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

localhost_log_file.YYYY-MM-DD.txt
Run Code Online (Sandbox Code Playgroud)

有一个更好的方法吗?

Wil*_*ard 13

您可以嵌套支撑扩展。

简短而甜蜜:

cat localhost_log_file.2017-{09-{03..30},10-{01..08}}.txt > totallog.csv
Run Code Online (Sandbox Code Playgroud)

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


iga*_*gal 8

如何使用该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
Run Code Online (Sandbox Code Playgroud)

请参阅此了解更多信息:

或者,您可以将循环的结果传递给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)
Run Code Online (Sandbox Code Playgroud)

这是使用管道和相同的事情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
Run Code Online (Sandbox Code Playgroud)