特定の日付範囲内のすべてのログファイルを分類する方法

特定の日付範囲内のすべてのログファイルを分類する方法

次の名前のログファイルがあります。

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の間のすべてのログファイルを収集したいと思います。つまり、fromlocalhost_log_file.2017-09-03.txtからlocalhost_log_file.2017-10-08.txt

私が今やっていることは、次のコマンドをそれぞれ個別に実行して3つの中間ファイルを生成することです。

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 Enterキーを押します
do Enterキーを押します
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" ]) Enterキーを押します then Enterキーを押します
cat $i >> totallog.csv Enterキーを押します
fi Enterキーを押します
done Enterキーを押します

関連情報